簡體   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