Sto provando a creare un'espressione filtro per filtrare i dati dal database.Albero delle espressioni e condizione AND
ho scritto la seguente estensione per costruire l'espressione dinamicamente a seconda dei parametri di filtro selezionati:
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;
}
lo sto usando in questo modo:
Expression<Func<MyObject, bool>> expression = x => true;
if(MyFilter.SomeParam) {
expression = expression.And(x=>x.MyProperty == MyFilter.SomeParam);
}
È perfettamente compatibile con NHibernate , ma quando sto usando questo codice con Entity Framework 5 non riesce con il seguente messaggio di eccezione:
Il tipo di nodo di espressione LINQ "Invoke" non è supportato in LINQ alle entità.
È una soluzione che recupera l'intera collezione dal database e poi applica condizioni di filtro attraverso il IEnumerable.Where(Func<T1, T2> filterClause)
, ma non hanno bisogno di tutti i dati solo per ottenere un record, mentre Expression<Func<T1, T2>>
espressioni sono tradotti direttamente in SQL.
Esiste un modo semplice per far funzionare questo codice con Entity Framework?
"Link solo" risposte tendono ad essere visto di buon occhio qui. Potresti almeno fornire un riassunto o altra indicazione di * perché * sarebbe utile. C'è anche la possibilità che qualunque cosa tu stia collegando potrebbe non essere più disponibile quando le persone leggono più tardi le tue risposte. –