Как создать вложенные операторы SQL внутри нескольких OR, используя LINQ - PullRequest
4 голосов
/ 06 мая 2011

Я пытаюсь создать запрос Equivelant LINQ из приведенного ниже примера SQL:

SELECT *
FROM FOO
WHERE 
    ((a == <val1>) AND (b == <val2>) AND (c == <val3>))
OR
    ((a == <val4>) AND (b == <val5>) AND (c == <val6>))

Всегда будут a, b и c, которые будут AND, вместе окруженные ИЛИ. Эта картина может встречаться n раз.

Единственное решение, которое я нашел для этой работы, - это использование LINQ Union, но сгенерированный SQL не тот, который я хотел бы.

Ответы [ 2 ]

1 голос
/ 06 мая 2011

Попробуйте реализовать класс 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);

Тогда предполагается, что ваши критерии перечислимыВнесите изменения в соответствии с вашими потребностями.

1 голос
/ 06 мая 2011

Вы можете сделать длинное условное утверждение:

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))

Или, что является предпочтительным ИМО:

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

Это также могут быть условные:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...