Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在成员属性上调用方法提供的表达式时,LinqKit System.InvalidCastException_C#_Linq_Entity Framework_Expression Trees_Linqkit - Fatal编程技术网

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

C# 在成员属性上调用方法提供的表达式时,LinqKit System.InvalidCastException,c#,linq,entity-framework,expression-trees,linqkit,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()

给定一个简单的父/子类结构。我想使用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());
公共类Foo
{
公共条{get;set;}
}
公共类酒吧
{
公共字符串值{get;set;}
公共静态表达式GetLambdaX()
{
返回c=>c.Value==“A”;
}
}
...
表达式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)
System.InvalidCastException:无法强制转换类型为的对象
“System.Linq.Expressions.MethodCallExpression”以键入
'System.Linq.Expressions.LambdaExpression'。
在LinqKit.ExpressionExpander.VisitMethodCall(MethodCallExpression m)中
在LinqKit.ExpressionVisitor.Visit(Expression exp)访问
在LinqKit.ExpressionVisitor.VisitLambda(LambdaExpression lambda)
在LinqKit.ExpressionVisitor.Visit(Expression exp)访问
在LinqKit.Extensions.Expand处(表达式'1 expr)
var lambdaX=Bar.GetLambdaX();
表达式lx=c=>lambdaX.Invoke(c.Bar);
这很有效

写作要小心

Expression<Func<Foo, bool>> lx = ...
表达式lx=。。。 在赋值之前,编译器处理这一行,并在您的例子中创建一个分配给lx的方法调用表达式(即用于调用Bar.GetLambdaX())

如果您使用var。。。然后Bar.GetLambdaX();调用并分配,其值(即lambda表达式)稍后将在lx=…

2021更新中使用:此错误已在版本1.1.22中修复。
,和。

我本来想帮你,但我无法编译你的代码。lx行不工作。确实为我编译了,lx行应该在例如一个util方法+1中,这是一个很好的答案!编译器处理lambda表达式中语句的上下文差异可能导致一些非常不直观的编译错误。@DoctorJones这不是编译器错误。这只是LINQKit中的一个bug。它不支持这种情况。它可以被编写来支持这段代码并正确工作(我有自己版本的同一个工具,可以很好地处理这段代码),但事实并非如此。我没有说这是一个编译器错误(即编译器错误),我说这是一个编译错误(以及编译过程中发生的错误)。我同意如果LINQKit支持这一点会很好,我也有自己的LINQKit版本,它可以处理比开箱即用更多的情况。@Servy有趣的是,5年后它仍然没有被修复。想发布你的版本吗?
Expression<Func<Foo, bool>> lx = ...