Próbuję utworzyć wyrażenie filtru w celu filtrowania danych z bazy danych.Drzewo wyrażeń i warunek AND
ja napisałem następujące rozszerzenia do budowania wyraz dynamicznie w zależności od wybranych parametrów filtra:
public static Expression<Func<T, bool>> And<T>(
this Expression<Func<T, bool>> leftExpression,
Expression<Func<T, bool>> rightExpression)
{
var invocationExpression = Expression.Invoke(rightExpression, leftExpression.Parameters.Cast<Expression>());
var andExpression = Expression.Lambda<Func<T, bool>>(
Expression.AndAlso(leftExpression.Body, invocationExpression),
leftExpression.Parameters);
return andExpression;
}
używam go w taki sposób:
Expression<Func<MyObject, bool>> expression = x => true;
if(MyFilter.SomeParam) {
expression = expression.And(x=>x.MyProperty == MyFilter.SomeParam);
}
działa świetnie z NHibernate , ale gdy używam tego kodu w Entity Framework 5, kończy się niepowodzeniem z następującym komunikatem wyjątku:
Typ węzła wyrażeń LINQ "Wywołanie" nie jest obsługiwany w LINQ do jednostek.
Jest jedno obejście, które pobiera całą kolekcję z bazy danych, a następnie stosuje się warunki filtrowania przez IEnumerable.Where(Func<T1, T2> filterClause)
, ale nie potrzebują wszystkie dane, aby dostać jeden rekord podczas Expression<Func<T1, T2>>
wyrażenia są tłumaczone bezpośrednio do SQL.
Czy istnieje prosty sposób, aby ten kod działał z Entity Framework?
"Link tylko" odpowiedzi wydają się być mile widziana tutaj. Czy mógłbyś przynajmniej podać streszczenie lub inne wskazanie * dlaczego * byłoby użyteczne. Istnieje również możliwość, że cokolwiek łączysz, nie będzie już dostępne, gdy ludzie później przeczytają twoje odpowiedzi. –