wake-up-neo.com

"Der LINQ-Ausdrucksknotentyp 'Invoke' wird in LINQ to Entities nicht unterstützt" - ratlos!

In meinem EF versuche ich später, eine anonyme Funktion weiterzugeben, die als Teil meiner Linq-Abfrage verwendet werden soll. Die Funktion würde ein INT übergeben und ein BOOL zurückgeben (u.RelationTypeId ist ein INT). Unten ist eine vereinfachte Version meiner 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();
    }
}

Ich erhalte jedoch den oben angegebenen Fehler. Es scheint, als würde ich alles richtig machen, indem ich ein Prädikat aus der Funktion aufbaue. Irgendwelche Ideen? Vielen Dank.

62
Ryan Peters

Sie versuchen, eine beliebige .NET-Funktion zu übergeben in ... Wie könnte das Entity-Framework hoffen, dies in SQL zu übersetzen? Sie können es ändern, um stattdessen einen Expression<Func<int, bool>> Zu verwenden und daraus die Where -Klausel zu erstellen, obwohl dies nicht besonders einfach sein wird, da dies erforderlich ist Schreiben Sie den Ausdruck mit einem anderen Parameterausdruck um (dh ersetzen Sie den Parameterausdruck im ursprünglichen Ausdrucksbaum durch den Ausdruck des Aufrufs von u.RelationTypeId).

Um ehrlich zu sein, wäre es besser, wenn Sie nur u.RelationTypeId In dem Lambda-Ausdruck angeben, den Sie zum Erstellen des Ausdrucksbaums für die Übergabe an die Methode verwenden:

public IEnumerable<UserBandRelation> GetBandRelationsByUser(
    Expression<Func<UsersBand, bool>> predicate)
{
    using (var ctx = new OpenGroovesEntities())
    {
        var relations = ctx.UsersBands.Where(predicate);

        // mapping, other stuff, back to business layer
        return relations.ToList();
    }
}
47
Jon Skeet

Ich habe genau diesen Fehler erhalten und benutze Entity Framework mit PredicateBuilder von Joe Albahari, um dynamische where -Klauseln zu erstellen. Wenn Sie sich in derselben Situation befinden, sollten Sie die AsExpandable -Methode aufrufen:

Wenn Sie mit Entity Framework abfragen, ändern Sie die letzte Zeile in:

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

Diese Methode ist Teil von LINQKIT DLL, das Sie abrufen können hier oder durch ein NuGet-Paket hier .

Alles funktioniert jetzt gut. :)

115

Sie können die Expand () -Methode in Ihrem Prädikat vor der Where -Anforderung aufrufen

3