为什么此代码会生成NotSupportedException?

时间:2010-04-27 08:19:37

标签: 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();

修改:这是一种MSDN reference(有点)解释事情......

  

LINQ to Entities中的任何方法调用   未显式映射的查询   一个规范的功能将导致   运行时NotSupportedException   异常被抛出。有关的列表   映射到的CLR方法   规范函数,请参阅CLR方法   规范函数映射。

另见http://mosesofegypt.net/post/LINQ-to-Entities-what-is-not-supported.aspx

3 个答案:

答案 0 :(得分:9)

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

表达式树翻译器知道各种事物 - 例如字符串相等性和各种其他方法(例如string.StartsWith)但它知道你的foo方法确实 - foo()就其而言是一个黑盒子。因此无法将其转换为SQL。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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