4

我刚开始将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;
}

工作正常?

4

1 回答 1

4

那是因为在您的表达式中您正在访问一个字段。异常告诉您您正在访问一个字段。

创建查询时不会计算表达式。它仅在您执行后才执行。届时,它将需要解析该字段。一种解决方法是首先将表达式放入局部变量:

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。

于 2014-03-06T12:17:57.193 回答