LinqKit System.InvalidCastException在成员属性上调用方法提供的表达式时

给定一个简单的父/子类结构。 我想使用linqkit在父级上应用子lambda表达式。 我还希望Lambda表达式由实用程序方法提供。

public class Foo { public Bar Bar { get; set; } } public class Bar { public string Value { get; set; } public static Expression<Func> GetLambdaX() { return c => c.Value == "A"; } } ... Expression<Func> 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(Expression`1 expr) 

 var lambdaX = Bar.GetLambdaX(); Expression> lx = c => lambdaX.Invoke(c.Bar); 

这很有效。

写作要小心

 Expression> lx = ... 

在赋值之前,编译器处理此行,并在您的情况下创建一个分配给lx的方法调用表达式(即用于调用Bar.GetLambdaX())。

如果你使用var …那么Bar.GetLambdaX(); 调用并赋值,其值(即lambda表达式)稍后用于lx = …