"Die LINQ-Ausdruck ein node-type 'Invoke' wird nicht unterstützt LINQ to Entities" - ratlos!
In meinem EF-später, bin ich versucht, übergeben Sie eine anonyme Funktion verwendet werden, die als Teil meiner Linq-Abfrage. Würde die Funktion übergeben in eine INT-und eine Rückkehr BOOL (u.RelationTypeId ist ein INT). Unten ist eine vereinfachte version der Funktion:
public IEnumerable<UserBandRelation> GetBandRelationsByUser(Func<int, bool> relation)
{
using (var ctx = new OpenGroovesEntities())
{
Expression<Func<UsersBand, bool>> predicate = (u) => relation(u.RelationTypeId);
var relations = ctx.UsersBands.Where(predicate);
//mapping, other stuff, back to business layer
return relations.ToList();
}
}
Jedoch bekomme ich die Fehlermeldung oben angegeben. Wie es scheint, werde ich alles korrekt ist, indem Sie Gebäude ein Prädikat, das von der Funktion. Irgendwelche Ideen? Danke.
InformationsquelleAutor Ryan Peters | 2011-03-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sie versuchen, übergeben Sie einen beliebigen .NET-Funktion in... wie konnte das entity framework Hoffnung zu übersetzen, dass in SQL? Sie können es ändern, um eine
Expression<Func<int, bool>>
statt, und bauen Sie denWhere
- Klausel aus, dass, obwohl es nicht sein besonders einfach, denn Sie müssen schreiben Sie den Ausdruck mit einem anderen parameter expression (D. H. das ersetzen, was parameter-Ausdruck in der ursprünglichen expression tree mit dem Ausdruck der Berufungu.RelationTypeId
).Um ehrlich zu sein, für den Willen nur die Angabe
u.RelationTypeId
im lambda-Ausdruck, den Sie verwenden, um den expression tree zu übergeben, in der Methode, Sie wären besser dran, nur mit:irgendwo hier auf SO ein Beispiel habe ich geschrieben, dass passieren wird, reduzieren
Expression.Invoke
für den Zweck, dass EF arbeiten mit sub-Ausdrücke (etwas L2S unterstützt die out-of-the-box). Es kann immer noch nicht arbeiten mit Delegierten, natürlich - In nur zu sagen, dass ein Brenner ist hier irgendwo...href="http://stackoverflow.com/questions/1717444/combining-two-lamba-expressions-in-c/1720642#1720642">herein der Tat - aktivieren Sie einfach "inline"
Es gibt auch LinqKit, die enthält viele Funktionen benötigt, für die Manipulation von Ausdrücken.
Ich schließe mich Chris ' Vorschlag LinqKit => es macht die Verkettung Ausdruck<U<YourType, bool>> Prädikate zusammen extrem einfach.
InformationsquelleAutor Jon Skeet
War ich immer diesen Fehler sehr und ich bin mit Entity Framework mit PredicateBuilder von Joe Albahari zur Erstellung dynamischer
where
Klauseln. Wenn Sie zufällig in den gleichen Zustand, sollten Sie rufen dieAsExpandable
Methode:Wenn die Abfrage mit Entity Framework, ändern Sie die Letzte Zeile:
Diese Methode ist Teil LINQKIT DLL, die Sie ergreifen können, hier oder durch ein NuGet-Paket hier.
Alles funktioniert jetzt. 🙂
AsExpandable()
Ursachen Auswirkungen auf die Leistung? Ich benutze ein generic repository und verwenden Sie nur das Prädikat builder gelegentlich ist es Wert, es zu erstellen Sie eine separate repository-Methode für das Prädikat Gebäude?Ich habe keine Ahnung. Frag dich lieber, dass Joe Albahary direkt. 🙂 Das ist sein twitter: twitter.com/linqpad
Haben Sie herausgefunden, die Auswirkungen auf die Leistung? Ich bin in der gleichen situation wie du
Sieht aus wie mit der neuesten version brauchen Sie nicht zu verwenden
AsExpandable()
zu übergeben, die das PrädikatWhere()
. Möglicherweise, weil der neuePredicateBuilder.New<T>()
Ausgangspunkt?danke Mann du meinen Tag gerettet
InformationsquelleAutor Leniel Maccaferri
Können Sie anrufen Expand() methode auf Ihre Prädikat vor der wo Anfrage
InformationsquelleAutor Zerelli Seifeddine
Ich weiß, diese Antwort ist wirklich spät, aber ich lief in das gleiche problem und es hat mich hierher geführt, so dass ich dachte, ich würde teilen meine Lösung.
Lese ich Leniel Antwort, und es gab mir eine Idee. Die Standard-Typen haben die Methode "AsEnumerable()" verhält sich das genauso, lindern das Problem.
AsEnumerable()
verursachen dieWhere()
Funktion aufgerufen werden, die von Linq to Objects und nicht Linq to Entities.InformationsquelleAutor Yushatak