Как построить запрос Linq с помощью динамических операторов OR? - PullRequest
7 голосов
/ 24 августа 2011

следующий код:

var dynamicQuery = from a in _context.Users select a;
string[] args = new string[] { "aa", "bb", "cc" };
foreach (string word in args)
    dynamicQuery = dynamicQuery.Where(x => x.Name.Contains(word));
return dynamicQuery.ToList();

Позволит мне создать запрос Linq с динамическим списком И выражений.

Но предположим, что я хотел сделать то же самое, только с динамическим списком ИЛИ выражений?

1 Ответ

10 голосов
/ 24 августа 2011

Вам не нужно делать цикл вообще:

return _context.Users.Where(x => args.Any(word => x.Name.Contains(word)));

РЕДАКТИРОВАТЬ: В общем, вы можете использовать:

Func<User, bool> predicate = user => false;
foreach (var item in items)
{
    var predicateCopy = predicate;
    predicate = user => predicateCopy(user) || someOtherCondition;
}
return query.Where(predicate);

Это приведет к довольно глубоким стекам (один делегат вызывает другого, и т.д.). Там, где конкретная ситуация позволяет вам использовать Any, обычно это лучше.

Я бы ожидал, что Any сработает в большинстве ситуаций, когда у вас есть набор элементов, которые потенциально могут соответствовать ... подход, отличный от Any, является подходящим для "в некоторых ситуациях любой, кому за 18, - это хорошо. ... в некоторых ситуациях подходит любой человек с фамилией, начинающейся с буквы "G" и т. д.

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