Verwirrt über die Weitergabe Ausdruck vs. Func-Argumente

Ich habe einige Schwierigkeiten zu verstehen, die Unterschiede zwischen dem, wie Ausdrücke und Funcs funktionieren.
Dieses problem stellte sich, wenn jemand verändert eine Methode Signatur:

public static List<Thing> ThingList(Func<Thing, bool> aWhere)

Zu

public static List<Thing> ThingList(Expression<Func<Thing, bool>> aWhere)

Die brach meine Berufung code. Die alte aufrufen von code (was auch geklappt hat) sah so aus:

        ...
        object y = new object();
        Func<Thing, bool> whereFunc = (p) => p == y;
        things = ThingManager.ThingList(whereFunc);

Den neuen code (der nicht funktioniert) sieht so aus:

        ...
        object x = new object();
        Expression<Func<Thing, bool>> whereExpr = (p) => p == x;
        things = ThingManager.ThingList(whereExpr);

Diese ausfällt, innen ThingList(...) auf der Linie unter Verwendung des Ausdrucks:

        var query = (from t in context.Things.Where(aWhere)
        ...

Mit dem runtime error:

Unable to create a constant value of type 'System.Object'. Only primitive types ('such as Int32, String, and Guid') are supported in this context.

Diesem Beispiel ist konstruiert, aber meine Vermutung ist, es hat etwas zu tun mit der lokalen Objekt-variable x nicht richtig "kopiert" in den Ausdruck.

Kann mir jemand erklären, wie man mit dieser situation umzugehen im Allgemeinen, und warum die Func funktioniert, aber der Expression nicht?

InformationsquelleAutor Erix | 2012-01-04
Schreibe einen Kommentar