提问者:小点点

LINQ:Where()忽略简单的假条件


Expression<Func<SettingItemModel, bool>> func = _ => false;

return GetAllSettingItemModel().Where(func).OrderBy(s => s.OrderParameter);        

为什么如果我将这个简单的谓词赋给'func'而不是s=>s.settingcategory==-1(在我的情况下总是false),我会在忽略条件时获得所有元素,而不是获得0个元素呢?

我想是因为谓词中没有考虑SettingItemModel对象,但我不确定。


共1个答案

匿名用户

这看起来像是IQueryable提供程序的一个bug

理论上,IQueryable提供程序可以根据需要解释和处理该表达式,但对于常量false值,它似乎不正确。您将需要向您的提供商提出一个bug。

一种解决方法可能是将该表达式带入内存,并对IEnumerable进行检查

return GetAllSettingItemModel().ToList().Where(func).OrderBy(s => s.OrderParameter);   

或者如果表达式可以在本地求值,则在执行查询之前执行

return func() ? GetAllSettingItemModel().OrderBy(s => s.OrderParameter) :  Enumerable.Empty<SettingItemModel>();