3

为什么这会抛出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 参考,它(有点)解释了一些事情......

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

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

4

3 回答 3

9

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

表达式树翻译器知道各种事情——例如字符串相等和各种其他方法(例如string.StartsWith),但它知道你的foo方法做什么——foo()就它而言是一个黑盒子。因此它不能将其翻译成 SQL。

于 2010-04-27T08:21:53.280 回答
1

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

于 2010-04-27T08:21:40.367 回答
1

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

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

于 2010-04-27T08:22:08.483 回答