“Il tipo di nodo di espressione LINQ” Invoke “non è supportato in LINQ alle quadro” – stumped!

Nel mio EF più avanti, sto provando a passare una funzione anonima da utilizzare come parte della mia query Linq. La funzione passerebbe in un INT e restituirà un BOOL (u.RelationTypeId è un INT). Di seguito è una versione semplificata della mia funzione:

public IEnumerable GetBandRelationsByUser(Func relation) { using (var ctx = new OpenGroovesEntities()) { Expression<Func> predicate = (u) => relation(u.RelationTypeId); var relations = ctx.UsersBands.Where(predicate); // mapping, other stuff, back to business layer return relations.ToList(); } } 

Tuttavia, ottengo l’errore sopra indicato. Sembra che sto andando tutto corretto costruendo un predicato dalla funzione. Qualche idea? Grazie.

Stai cercando di passare una funzione .NET arbitraria in … come potrebbe la struttura dell’entity framework sperare di tradurla in SQL? Puoi cambiarlo per prendere Expression> , invece, e build la clausola Where da quella, anche se non sarà particolarmente facile, perché dovrai riscrivere l’espressione con un’espressione di parametro diversa ( cioè sostituire qualsiasi espressione di parametro è nell’albero dell’espressione originale con l’espressione di chiamare u.RelationTypeId ).

Per essere onesti, per il solo scopo di specificare u.RelationTypeId nell’espressione lambda che usi per creare l’albero delle espressioni da passare nel metodo, staresti meglio usando:

 public IEnumerable GetBandRelationsByUser( Expression> predicate) { using (var ctx = new OpenGroovesEntities()) { var relations = ctx.UsersBands.Where(predicate); // mapping, other stuff, back to business layer return relations.ToList(); } } 

Stavo ricevendo questo errore e sto utilizzando Entity Framework con PredicateBuilder di Joe Albahari per creare clausole di tipo dinamico. Se ti capita di AsExpandable nelle stesse condizioni, devi chiamare il metodo AsExpandable :

Se si esegue una query con Entity Framework , modificare l’ultima riga in questo modo:

return objectContext.Products.AsExpandable().Where(predicate);

Questo metodo fa parte della DLL LINQKIT che puoi recuperare qui o tramite un pacchetto NuGet qui .

Adesso funziona tutto bene. 🙂

È ansible chiamare il metodo Expand () sul predicato prima della richiesta where

So che questa risposta è davvero tardiva, ma mi sono imbattuto nello stesso problema e mi ha condotto qui, quindi ho pensato di condividere la mia soluzione.

Ho letto la risposta di Leniel e mi ha dato un’idea. I tipi di default hanno il metodo “AsEnumerable ()” che si comporta allo stesso modo, alleviando il problema.