为什么抛出 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
答案 0 :(得分:9)
编辑:好的,代码爆炸了,因为它不知道如何处理对foo()
的调用。该查询构建为表达式树,然后转换为SQL。
表达式树翻译器知道各种事物 - 例如字符串相等性和各种其他方法(例如string.StartsWith
)但它不知道你的foo
方法确实 - foo()
就其而言是一个黑盒子。因此无法将其转换为SQL。
答案 1 :(得分:1)
第二个版本会在您尝试迭代它时失败。您不能在IQueryable<>
where
子句中使用本地定义的方法(当然,您可以,但当LINQ提供程序尝试将其转换为SQL时,它将失败)。
答案 2 :(得分:1)
因为在第二个查询中没有执行实际查询。尝试在ToList()
所在地添加SingleOrDefault()
。
这可能是因为SQL生成功能无法确定如何处理foo()
函数,因此无法为其生成输出。