LinqKit System.InvalidCastException Beim Aufrufen des von einer Methode bereitgestellten Ausdrucks für die Member-Eigenschaft

c# entity-framework expression-trees linq linqkit

Frage

Eine einfache Eltern / Kind-Klassenstruktur vorausgesetzt. Ich möchte Linqkit verwenden, um einen untergeordneten Lambda-Ausdruck auf dem übergeordneten Element anzuwenden. Ich möchte auch, dass der Lambda-Ausdruck von einer Dienstprogrammmethode bereitgestellt wird.

public class Foo
{
    public Bar Bar { get; set; }
}

public class Bar
{
    public string Value { get; set; }
    public static Expression<Func<Bar, bool>> GetLambdaX()
    {
        return c => c.Value == "A";
    }
}
...

Expression<Func<Foo, bool>> lx = c => Bar.GetLambdaX().Invoke(c.Bar);
Console.WriteLine(lx.Expand());

Der obige Code löst aus

System.InvalidCastException: Unable to cast object of type 
'System.Linq.Expressions.MethodCallExpression' to type 
'System.Linq.Expressions.LambdaExpression'.
at LinqKit.ExpressionExpander.VisitMethodCall(MethodCallExpression m)
at LinqKit.ExpressionVisitor.Visit(Expression exp)
at LinqKit.ExpressionVisitor.VisitLambda(LambdaExpression lambda)
at LinqKit.ExpressionVisitor.Visit(Expression exp)
at LinqKit.Extensions.Expand<TDelegate>(Expression`1 expr)

Akzeptierte Antwort

var lambdaX = Bar.GetLambdaX();

Expression<Func<Foo, bool>> lx = c => lambdaX.Invoke(c.Bar);

Das funktioniert.

Sei vorsichtig beim Schreiben

Expression<Func<Foo, bool>> lx = ...

Vor der Zuweisung verarbeitet der Compiler diese Zeile und erstellt in Ihrem Fall einen Methodenaufruf-Ausdruck (dh für den Aufruf von Bar.GetLambdaX ()), der lx zugeordnet ist.

Wenn Sie var ... verwenden, dann Bar.GetLambdaX (); wird aufgerufen und zugewiesen, dessen Wert (welcher der Lambda-Ausdruck ist) wird später in lx = ... verwendet



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow