如何使用LINQ在多个OR内创建SQL嵌套AND

时间:2011-05-05 22:11:22

标签: sql linq-to-entities

我正在尝试从以下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不是我想要的。

2 个答案:

答案 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);

然后假设您的标准是可枚举的。根据需要进行修改以满足您的需求。