Почему этот код генерирует NotSupportedException? - PullRequest
3 голосов
/ 27 апреля 2010

Почему выдается 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

Ответы [ 3 ]

9 голосов
/ 27 апреля 2010

EDIT: Хорошо, код взрывается, потому что он не знает, что делать с вызовом foo(). Запрос создается в виде дерева выражений , которое затем преобразуется в SQL.

Переводчик дерева выражений знает о различных вещах - таких как равенство строк и другие методы (например, string.StartsWith), но он не знает, что делает ваш метод foo - foo() это черный ящик, насколько это касается. Поэтому он не может перевести его на SQL.

1 голос
/ 27 апреля 2010

Поскольку во втором запросе фактический запрос не выполняется. Попробуйте добавить ToList(), где SingleOrDefault().

Вероятно, это связано с тем, что функция генерации SQL не может определить, что делать с вашей функцией foo(), поэтому не может генерировать для нее выходные данные.

1 голос
/ 27 апреля 2010

Вторая версия потерпит неудачу, как только вы попытаетесь повторить ее. Вы не можете использовать локально определенный метод в предложении IQueryable<> where (конечно, вы можете, но он потерпит неудачу, когда поставщик LINQ попытается преобразовать его в SQL).

...