LinqKit System.InvalidCastException al invocar la expresión proporcionada por el método en la propiedad del miembro

c# entity-framework expression-trees linq linqkit

Pregunta

Dada una estructura de clase padre / hijo simple. Quiero usar linqkit para aplicar una expresión lambda secundaria en el padre. También quiero que la expresión Lambda sea proporcionada por un método de utilidad.

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

El código anterior arroja

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)

Respuesta aceptada

var lambdaX = Bar.GetLambdaX();

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

Esto funciona.

Ten cuidado con la escritura

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

Antes de la asignación, el compilador procesa esta línea y, en su caso, crea una expresión de llamada de método (es decir, para llamar a Bar.GetLambdaX ()) que se asigna a lx.

Si usa var ... entonces Bar.GetLambdaX (); se llama y se asigna, cuyo valor (que es la expresión lambda) se usa más adelante en lx = ...



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow