我正在尝试从以下SQL示例创建equivelant LINQ查询:
SELECT *
FROM FOO
WHERE
((a == <val1>) AND (b == <val2>) AND (c == <val3>))
OR
((a == <val4>) AND (b == <val5>) AND (c == <val6>))
总会有一个a,b和c一起被OR包围在一起。这种模式可以发生很多次。
我发现唯一的解决方案是使用LINQ Union,但生成的SQL不是我想要的。
答案 0 :(得分:1)
你可以做一个长条件陈述:
var foo = from f in db.Foos.Where((f => f.A == val1 && f.b == val2 && f.c == val3) ||
(f => f.A == val4 && f.b == val5 && f.c == val6))
或者,这是更好的IMO:
var predicate = PredicateBuilder.False<Foo>();
predicate = predicate.Or(f => f.A == val1 && f.A == val2 && f.A == val3);
predicate = predicate.Or(f => f.A == val4 && f.A == val5 && f.A == val6);
var foo = db.Foos.Where(predicate);
这些也可以是有条件的:
var predicate = PredicateBuilder.False<Foo>();
predicate = predicate.Or(f => f.A == val1 && f.A == val2 && f.A == val3);
if (condition)
predicate = predicate.Or(f => f.A == val4 && f.A == val5 && f.A == val6);
var foo = db.Foos.Where(predicate);
答案 1 :(得分:1)
尝试实施PredicateBuilder
课程。
那么也许你可以使用这样的东西:
var pred = PredicateBuilder.False<Foo>();
foreach(var criteria in myCriteriaSet)
{
pred = pred.Or(x => x.ID== criteria.ID &&
x.Name== criteria.Name &&
x.Created == criteria.SomeDate);
}
var matching = db.Foos.Where(pred);
然后假设您的标准是可枚举的。根据需要进行修改以满足您的需求。