我需要能够在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语句。感谢任何可以提供帮助的人!
答案 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);