LinqKit System.InvalidCastException lors de l'invocation d'une expression fournie par la méthode sur la propriété member

c# entity-framework expression-trees linq linqkit

Question

Étant donné une structure de classe parent / enfant simple. Je souhaite utiliser linqkit pour appliquer une expression lambda enfant au parent. Je souhaite également que l'expression Lambda soit fournie par une méthode utilitaire.

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

Le code ci-dessus jette

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

Réponse acceptée

var lambdaX = Bar.GetLambdaX();

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

Cela marche.

Attention à l'écriture

var lambdaX = Bar.GetLambdaX();

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

Avant l'affectation, le compilateur traite cette ligne et crée dans votre cas une expression d'appel de méthode (c'est-à-dire pour appeler Bar.GetLambdaX ()) affectée à lx.

Si vous utilisez var ... alors Bar.GetLambdaX (); est appelée et assignée, la valeur (qui est l'expression lambda) est utilisée plus tard dans lx = ...




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi