ho bisogno di filtrare un elenco di documenti inviandoli ad un filtro personalizzato che sto lottando per creare dinamicamente utilizzando un foreach
ciclo:Costruire un predicato personalizzato di agire come un filtro con un foreach ciclo
var mainPredicate = PredicateBuilder.True<Document>();
// mainPredicate is combined to other filters successfully here ...
var innerPredicate = PredicateBuilder.False<Document>();
foreach (var period in periods)
{
var p = period;
Expression<Func<Document, bool>> inPeriod =
d => d.Date >= p.DateFrom && d.Date <= p.DateTo;
innerPredicate = innerPredicate.Or(d => inPeriod.Invoke(d));
}
mainPredicate = mainPredicate.And(innerPredicate);
questa ultima riga:
documents = this.ObjectSet.AsExpandable().Where(mainPredicate).ToList();
genera questa eccezione:
Il parametro 'd' non è stato associato nell'espressione query LINQ to Entities .
Qualcuno sa perché sto ottenendo questa eccezione? Non capisco dove si perde il parametro 'd' che sto passando al metodo InPeriod. Non so cosa manca per far funzionare tutto questo. Il mio codice è lo stesso di molti altri esempi che funzionano perfettamente. Qualsiasi ulteriore informazione teorica teorica su espressioni che invocano e come funziona dietro le quinte sono le benvenute.
Cosa succede se si esegue 'mainPredicate.Expand(). Compile(). Invoke (someDocument)'? Sei sicuro che il problema non sia da qualche altra parte (il tuo codice sembra a posto per me)? – svick
Dato il tuo suggerimento, ho modificato l'ultima riga in modo che assomigli a questo: 'documentEntries = this.ObjectSet.AsExpandable(). Where (de => mainPredicate.Expand(). Compile(). Invoke (de)). ToList (); 'but but: LINQ to Entities non riconosce il metodo 'Boolean Invoke (Remabec.PM.Tarification.DocumentEntry)' e questo metodo non può essere tradotto in un'espressione di archivio. –
Sì, non funzionerà e non è quello che intendevo. Potresti provare ad eseguire il mio codice da solo? – svick