如何结合Linq查询结果

时间:2010-10-12 17:14:02

标签: linq

我需要能够在Linq查询中添加未知数量的where子句。目前我一直在尝试使用Concat()组合查询。例如:

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 个答案:

答案 0 :(得分: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 :(得分:1)

如果您尝试执行 r1 = r1 + r2 ,则应使用某些 immediate query execution 行为,例如ToList。您会看到,在LINQ中,查询仅在需要时执行,而不是在定义它的位置执行。 所以查询应该看起来像

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

另外,请注意使用 Union 而不是Concat。 “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);