2010-10-12 139 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);