LinqKit System.InvalidCastException在成員屬性上調用方法提供的表達式時

c# entity-framework expression-trees linq linqkit

給定一個簡單的父/子類結構。我想使用linqkit在父級上應用子lambda表達式。我還希望Lambda表達式由實用程序方法提供。

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

上面的代碼拋出

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)

一般承認的答案

var lambdaX = Bar.GetLambdaX();

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

這很有效。

寫作要小心

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

在賦值之前,編譯器處理此行,並在您的情況下創建一個分配給lx的方法調用表達式(即用於調用Bar.GetLambdaX())。

如果你使用var ...那麼Bar.GetLambdaX();調用並賦值,其值(即lambda表達式)稍後用於lx = ...



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因