2010-10-12 171 views
0

我需要能夠添加一個未知數的where子句到Linq查詢。目前我一直在試圖將使用Concat()的查詢結合起來。例如:如何結合Linq查詢結果

var r1 = 
    from field in db.fields 
    where ID == 1 
    select field; 

var r2 = 
    from field in db.fields 
    where ID == 2 
    select field 

var r3 = r1.Concat(r2); 

這給了我很奇怪的結果,所以我知道必須有更好的方法來做到這一點。有沒有辦法按照「積累的結果」來做某件事?例如:

r1 = r1 + r2 

其中r1獲得之前所有的結果以及r2的所有結果。這將允許我遍歷「where」過濾器列表並將它們組合爲OR語句。感謝任何能提供幫助的人!

回答

2

這聽起來像你正在尋找聯合運營:

var r1 = Context.Fields.Where<FieldObject>(f => f.ID == 1).Select<FieldObject, Field>(f => f.Field); 
var r2 = Context.Fields.Where<FieldObject>(f => f.ID == 2).Select<FieldObject, Field>(f => f.Field); 
var r3 = r1.Union<Field>(r2); 
1

如果你正在嘗試做R1 = R1 + R2,那麼你應該使用一些immediate query execution行爲,像ToList。您會看到,在LINQ中,查詢只在需要時執行,而不在其定義的位置。 所以查詢應該像

r1 = r1.Union(r2).ToList() 

另外,還要注意使用聯盟代替的毗連的。 「Concat方法返回輸入序列中的所有原始元素,Union方法只返回唯一元素。」 (從msdn

編輯:您也可以用PredicateBuilder打造OR-ED謂詞,財產以後像

var predicate = PredicateBuilder.False<Field>(); 
foreach(Expression<Func<Field,Boolean>> filt in filters){ 
    predicate = predicate.Or(filt); 
} 
var result = db.fields.Where(predicate);