Преобразование лямбда-функций в лямбда-выражение - PullRequest
1 голос
/ 16 октября 2011

Я пытаюсь объединить множественный выбор с лямбда-функцией в лямбда-выражение. Как я могу это сделать? Я знаю, что последняя строка неверна, но дает вам представление о том, что я имею в виду.

Func<Event, bool> where = null;

if (!string.IsNullOrWhiteSpace(searchToken))
    where = q => q.Name.ToUpper().Contains(searchToken.ToUpper());

where += q => q.Hidden = false;

Expression<Func<Event, bool>> where1 = q => where; <-- Erroring

Ответы [ 2 ]

4 голосов
/ 16 октября 2011

Я подозреваю, что вы хотите PredicateBuilder. (Источник доступен на этой странице.) Вы бы использовали его так:

var predicate = q => !q.Hidden;
if (!string.IsNullOrWhiteSpace(searchToken))
{
    predicate = predicate.And(q => q.Name.ToUpper()
                                         .Contains(searchToken.ToUpper());
}
return predicate;

Это предполагает, что вы хотите "и" условия - вы никогда не давали этого ясно ...

Обратите внимание, что это , а не - это также хороший способ сравнения без учета регистра. Если бы вы могли сообщить нам, что будет потреблять запрос (например, LINQ to SQL, LINQ to EF), мы могли бы предложить совместимый с поставщиком способ выполнения запроса без учета регистра.

0 голосов
/ 16 октября 2011

Посмотрите на http://msdn.microsoft.com/en-us/library/bb882637.aspx. Как использовать деревья выражений для построения динамических запросов.

AFAIK при использовании Expression <> так, что выражение должно быть известно во время компиляции, потому что компилятор затем строит ASTабстрактный синтаксис три и сохраняет его как данные в вашем экземпляре Expression <>.

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