2011-10-17 46 views
1

假設你正在尋找有兩個布爾屬性,A和B.你如何拆分或加入「或」(不使用聯盟)的linq查詢?

一些對象是什麼,如果你有兩個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 => x.A分解爲一個案例。通過鏈接where子句x.A & & x.B。這就是我的意思:

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

是否有一些類似的解決方法或情況?

感謝,

艾薩克

回答

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(); 
+0

這看起來像我想要的。我會試試看看它是否有效。 –

+2

很好用。我在你的債務阿德里安! –

1

如果你的LINQ提供程序不支持聯合運營商,你總是可以先兌現使用ToArray的()查詢結果,然後使用LINQ到對象提供商以執行它支持的聯盟,如下所示:

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); 

只要您的聯盟結果不是太大,就可以很好地工作。

+0

我不想這樣做,我想從數據庫中檢索儘可能少的記錄。我知道這會工作,但!謝謝。 –