我刚刚开始在EntityFramework 6.0.2中使用LinqKit,我有以下问题...
为什么这样:
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;
}
工作正常吗?
答案 0 :(得分:4)
那是因为在你的表达中你正在访问一个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。