C# 为什么此代码会生成NotSupportedException?

C# 为什么此代码会生成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中对实体的任何方法调用 未显

为什么会抛出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中对实体的任何方法调用 未显式映射的查询 对规范函数的修改将导致 运行时NotSupportedException 正在引发异常。有关 映射到的CLR方法 有关规范函数,请参见CLR方法 规范函数映射


另请参见

第二个版本将在您尝试迭代时失败。您不能在
IQueryable
where
子句中使用本地定义的方法(当然可以,但当LINQ提供程序尝试将其转换为SQL时,它将失败)。

编辑:好的,代码崩溃是因为它不知道如何处理对
foo()的调用。查询建立为表达式树,然后转换为SQL


表达式树转换器知道各种事情,例如字符串相等和各种其他方法(例如
string.StartsWith
),但它不知道
foo
方法做什么-
foo()
是一个黑盒。因此,它无法将其转换为SQL。

因为在第二个查询中没有执行实际的查询。尝试将
ToList()
添加到
SingleOrDefault()
所在的位置


这可能是因为SQL生成功能无法确定如何处理
foo()
函数,因此无法为其生成输出。

这就是为什么我不喜欢混淆
var
:-/@Nayan:它将显示与显式类型局部变量完全相同的行为。是的,Jon,但如果不是这样,它将是可读的。