繁体   English   中英

为什么在使用静态字段中的表达式时会出现InvalidCastException?

[英]Why am I getting an InvalidCastException when using an expression from a static field?

我刚刚开始使用LinqKit和EntityFramework 6.0.2,我有以下问题......

为什么这样:

public static readonly Expression<Func<MyEnum, string>> ConvertToString = e => 
        e == MyEnum.One
                    ? "one"
                    : e == MyEnum.Two
                        ? "two"
                        : "zero";

private static string GetSomethingElse(IQueryable<EnumTest> things)
{           
    var ret = things
        .AsExpandable()
        .Select(c => Program.ConvertToString.Invoke(c.SomeEnum))
        .First();
    return ret;
}

扔:

An unhandled exception of type 'System.InvalidCastException' 
    occurred in LinqKit.dll

Additional information: Unable to cast object of type     
    'System.Linq.Expressions.FieldExpression' to type 
    'System.Linq.Expressions.LambdaExpression'.

但是这个:

private static string GetSomething(IQueryable<EnumTest> things)
{
    Expression<Func<MyEnum, string>> ConvertToString = e => e == MyEnum.One
        ? "one"
        : e == MyEnum.Two
            ? "two"
            : "zero";

    var ret = things
        .AsExpandable()
        .Select(c => ConvertToString.Invoke(c.SomeEnum))
        .First();
    return ret;
}

工作良好?

那是因为在你的表达中你正在访问一个Field。 该例外告诉您正在访问字段。

创建查询时不评估表达式。 它只在执行后执行。 此时,它将需要解决该字段。 解决方法是首先将表达式放入局部变量:

private static string GetSomething(IQueryable<EnumTest> things)
{
    var expression = Program.ConvertToString;

    var ret = things
        .AsExpandable()
        .Select(c => expression.Invoke(c.SomeEnum))
        .First();
    return ret;
}

看到您在EntityFramework中使用它,会发生什么是您的表达式将转换为SQL查询。 但是,由于您正在访问表达式中的类,因此无法将其转换为SQL语句(它将如何执行此操作?)。 当你有一个表达式的实例(使用局部变量)时,你将消除这个类访问,并且该表达式可以转换为SQL。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM