你如何在“或”(不使用Union)上拆分或加入linq查询?

时间:2011-10-17 23:27:07

标签: c# linq predicatebuilder

假设您正在使用两个布尔属性A和B搜索某个对象。

如果你有两个linq查询怎么办:

IQueryable<ObjectType> query = getIQueryableSomehow()
query.Where(x => x.A);

IQueryable<ObjectType> query2 = getIQueryableSomehow()
query2.Where(x => x.B);

如何将这些查询加在一起,以便它们与此相同?:

IQueryable<ObjectType> query3 = getIQueryableSomehow()
query3.Where(x => x.A || x.B)

我想使用query3 = query.Union(query2),但遗憾的是我的Linq提供者联盟不受支持。

我将案例分为x =&gt; x.A&amp;&amp; x.B通过链接where子句。这就是我的意思:

IQueryable<ObjectType> query = getIQueryableSomehow();
query = query.Where(x => x.A);
query = query.Where(x => x.B);

是否有一些类似的解决方法?

谢谢,

艾萨克

2 个答案:

答案 0 :(得分:6)

使用Predicate Builder

IQueryable<ObjectType> query = getIQueryableSomehow();
var predicate = PredicateBuilder.False<ObjectType>();
predicate = predicate.Or(x => x.A);
predicate = predicate.Or(x => x.B);

var list = query.Where(predicate).ToList();

答案 1 :(得分:1)

如果您的LINQ提供程序不支持Union运算符,您始终可以首先使用ToArray()实现查询结果,然后使用LINQ-to-objects提供程序执行它支持的并集,如下所示:

IQueryable<ObjectType> query = getIQueryableSomehow() 
query.Where(x => x.A); 

IQueryable<ObjectType> query2 = getIQueryableSomehow() 
query2.Where(x => x.B); 

IQueryable<ObjectType> query3 = query.ToArray().AsQueryable<ObjectType>().Union(query2);

只要结合的结果不是太大,这就可以正常工作。