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

时间:2010-04-02 04:13:05

标签: c# linq entity-framework expression-trees 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)

2 个答案:

答案 0 :(得分:29)

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 = ...

中使用

答案 1 :(得分:1)

2021 更新:从 1.1.22 版本开始,此错误已得到修复。

An issue was opened for this bug in September of 2020it was fixed in version 1.1.22 released on January 16th 2021