LinqKit System.InvalidCastException Durante il richiamo dell'espressione fornita dal metodo sulla proprietà del membro

c# entity-framework expression-trees linq linqkit

Domanda

Data una semplice struttura di classe genitore / figlio. Voglio usare linqkit per applicare un'espressione lambda child sul genitore. Voglio anche che l'espressione Lambda sia fornita da un metodo di utilità.

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());

Il codice sopra riportato

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)

Risposta accettata

var lambdaX = Bar.GetLambdaX();

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

Questo funziona.

Stai attento con la scrittura

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

Prima dell'assegnazione il compilatore elabora questa riga e nel tuo caso crea un Method Call Expression (cioè per chiamare Bar.GetLambdaX ()) che è assegnato a lx.

Se usi var ... then Bar.GetLambdaX (); viene chiamato e assegnato, il valore di cui (che è l'espressione lambda) viene utilizzato successivamente in lx = ...



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché