linq-to-sql комбинированные выражения - PullRequest
2 голосов
/ 31 марта 2010

Можно ли как-нибудь объединить список выражений в одно? У меня есть List<Expression<Child, bool>> expList и пытаюсь объединить в одно (и тоже) и получить

Expression<Child, bool> combined = Combine(expList);

Предполагаемое использование для комбинированного выражения:

//type of linqFilter is IQueryable<Parent>
linqFilter = linqFilter.SelectMany(p => p.Child).
         Where(combined).Select(t=> t.Parent); 

Я пытаюсь что-то вроде этого:

var result = expList.Cast<Expression>().
Aggregate((p1, p2) => Expression.AndAlso(p1, p2));

Но, получив исключение

{"The binary operator AndAlso is not defined for the types 'System.Func`2[Child,System.Boolean]' and 'System.Func`2[Child,System.Boolean]'."}

1 Ответ

5 голосов
/ 31 марта 2010

Попробуйте это как компоновщик, так что вам придется рекурсивно вызывать его для каждого в expList

public Expression<Func<T, bool>> Combine<T>(Expression<Func<T, Boolean>> first, Expression<Func<T, Boolean>> second)
{
   var toInvoke = Expression.Invoke(second, first.Parameters);

   return (Expression<Func<T, Boolean>>)Expression.Lambda(Expression.AndAlso(first.Body, toInvoke), first.Parameters);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...