1

可能重复:
Linq - 在动态构建 LINQ 查询时模拟 OrWhere 表达式?

我想知道是否有人可以帮助我。

我知道在实体框架中,我们可以将 where 链接在一起,例如

data.Where(x=>x.Id == id ).Where(x=>x.Name == name).Where(x=>x.State == state);

所以基本上 where 转化为 AND

data.Where(x=>x.Id==id && x.Name == name && x.State == state);

有没有办法为 OR 做同样的事情

data.Where(x=>x.Id==id || x.Name == name || x.State == state);

可以表示为...

4

2 回答 2

5

我认为最好的方法是使用Predicate Builder

于 2012-10-11T17:15:17.107 回答
0

对于开箱即用的 Linq 方法,简短的回答是“否”,原因如下:

我了解 OP 处理IQueryable<T>和不处理IEnumerable<T>,但前者中可用的功能基于后者。

IEnumerable<T>Linq(或 Linq to Objects)的工作原理是将各种 linq 方法的执行推迟到迭代集合为止,即使迭代开始,它也只执行生成集合中的下一个项目所需的工作。

因为我们在谈论 WHERE,所以我们在谈论过滤功能。假设你有Base.Where(ConditionA).Where(ConditionB).Where(ConditionC). 在运行时,这是通过遍历基本集合来处理的,直到找到满足的第一个项目,ConditionA然后将该项目传递给下一个函数。如果该项目满足ConditionB,则将其传递给ConditionC,如果该项目不满足ConditionBConditionB则从 请求下一个项目ConditionA,为了ConditionA获得下一个项目,它会继续迭代 ,Base直到找到另一个满足 的项目ConditionA,然后ConditionB测试看看新项目是否满足,以此类推。

在这种类型的工作流中不存在an 的原因.OrWhere()是,前面的语句需要知道它正在将结果传递给这样的函数,并且它本质上需要传递它遇到的每个项目(即使条件不满足),但无论是否满足,都会传递很长时间。这给原本简单的操作增加了很多复杂性。

希望这可以帮助...

于 2012-10-11T17:35:47.180 回答