C# 为什么此代码会生成NotSupportedException?
为什么会抛出System.NotSupportedExceptionC# 为什么此代码会生成NotSupportedException?,c#,linq-to-entities,notsupportedexception,C#,Linq To Entities,Notsupportedexception,为什么会抛出System.NotSupportedException string foo(string f) { return f; } string bar = ""; var item = (from f in myEntities.Beer where f.BeerName == foo(bar) select f).FirstOrDefault(); 编辑:这里有一个(某种)解释 LINQ中对实体的任何方法调用 未显
string foo(string f) { return f; }
string bar = "";
var item = (from f in myEntities.Beer
where f.BeerName == foo(bar)
select f).FirstOrDefault();
编辑:这里有一个(某种)解释
LINQ中对实体的任何方法调用
未显式映射的查询
对规范函数的修改将导致
运行时NotSupportedException
正在引发异常。有关
映射到的CLR方法
有关规范函数,请参见CLR方法
规范函数映射
另请参见第二个版本将在您尝试迭代时失败。您不能在
IQueryable
where
子句中使用本地定义的方法(当然可以,但当LINQ提供程序尝试将其转换为SQL时,它将失败)。编辑:好的,代码崩溃是因为它不知道如何处理对foo()的调用。查询建立为表达式树,然后转换为SQL
表达式树转换器知道各种事情,例如字符串相等和各种其他方法(例如string.StartsWith
),但它不知道foo
方法做什么-foo()
是一个黑盒。因此,它无法将其转换为SQL。因为在第二个查询中没有执行实际的查询。尝试将ToList()
添加到SingleOrDefault()
所在的位置
这可能是因为SQL生成功能无法确定如何处理foo()
函数,因此无法为其生成输出。这就是为什么我不喜欢混淆var
:-/@Nayan:它将显示与显式类型局部变量完全相同的行为。是的,Jon,但如果不是这样,它将是可读的。