Linq to Entity - Как объединить условия - PullRequest
0 голосов
/ 21 июля 2011

Я пишу запрос Linq. Есть ли способ, которым я могу объединить запрос на основе некоторых условий?

Как и на запрос

    from res in _db.Person
    where res.Departments.ID == deptId
    select res;

И если у меня есть условие true, я бы хотел, чтобы оно было что-то вроде

from res in _db.Person
    where res.Departments.ID == deptId && res.Departments.Type == deptType
    select res;

Ответы [ 3 ]

5 голосов
/ 21 июля 2011

Реализовать условие типа «И» легко и просто, используя синтаксис метода расширения для вызова Where несколько раз:

IQueryable<Person> people = _db.Person
                               .Where(res => res.Departments.ID == deptId);
if (deptType != null)
{
    people = people.Where(res => res.Departments.Type == deptType);
}

// Potentially add projections etc.

РЕДАКТИРОВАТЬ: если вам нужна функциональность "ИЛИ", она немного сложна с нуля, так как вам нужно возиться с деревьями выражений. Я предлагаю вам использовать библиотеку PredicateBuilder:

Expression<Func<Person, bool> predicate = res => res.Departments.ID == deptId;
if (deptType != null)
{
    predicate = predicate.Or(res => res.Departments.Type == deptType);
}
IQueryable<Person> people = _db.Person.Where(predicate);
3 голосов
/ 21 июля 2011

Предполагая, что ваше условие находится в состоянии переменной

from res in _db.Person
where res.Departments.ID == deptId && (!condition || res.Departments.Type == deptType)
select res;

Версия, которая делает или как запрашивается

from res in _db.Person
where res.Departments.ID == deptId || (condition && res.Departments.Type == deptType))
select res;

В качестве альтернативы вы можете использовать построитель предикатов

1 голос
/ 21 июля 2011

Я бы сделал что-то вроде этого:

var result = _db.Person.Where(x=>x.Departments.ID == deptId);
if(myCondition)
   result = result.Where(x=>x.Departments.Type == deptType);

На самом деле запрос не выполняется до тех пор, пока вы не попытаетесь перечислить result, поэтому вы можете добавлять условия так долго, как вам хочется.

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