Импорт функций из SQL Server в Entity Framework исключение времени выполнения - PullRequest
2 голосов
/ 30 июля 2011

Я пытаюсь отобразить хранимую процедуру в моей базе данных на функцию в EF для построения запросов в моем коде с помощью LINQ.

Моя хранимая процедура возвращает / выбирает (пробовал ОБА, без разницы) целочисленное значение. Я могу отобразить в функцию и увидеть ее в коде (с правильными типами ввода / вывода), но всякий раз, когда я пытаюсь выполнить запрос, я получаю следующее исключение:

LINQ to Entities does not recognize the method 'System.Data.Objects.ObjectResult`1[System.Nullable`1[System.Int32]] HammingDistance(System.Nullable`1[System.Int64], System.Nullable`1[System.Int64])' method, and this method cannot be translated into a store expression.

LINQ, вызывающий ошибку:

db.HammingDistance(targetPhoto.Analysis.Hash, p.Analysis.Hash).FirstOrDefault().Value < 10

, который содержится в предложении where. Без этой части запрос выполняется без проблем.

Да, моя процедура под названием HammingDistance принимает два long и возвращает int. Я пытался создать его как функцию сервера SQL вместо хранимой процедуры, но потом я не могу импортировать ее как функцию, чего я и хочу. У меня есть сложные запросы, включающие процедуру (и протестированы в Management Studio, она работает и возвращает значение правильно), нет нулей ни в БД, ни в коде, это не проблема. Я дважды проверил, что моя процедура там и работает ПОСЛЕ ошибки, без изменений в коде SQL. Но LINQ не признает этого. И, наконец, ДА, мне нужно, чтобы это работало на SQL Server, я не могу обработать извлечение всех полей из БД и запустить на ASP.NET. Я знаю, что это можно сделать, и я почти уверен, что это проблема конфигурации, поскольку и моя БД, и веб-сайт, и запросы LINQ выполняются без вызова HammingDistance, но я просто не могу связать их в этот момент.

Ответы [ 2 ]

2 голосов
/ 30 июля 2011

Вы не можете вызвать хранимую процедуру из запроса linq-to-entity.Это то же самое, что и при непосредственном использовании SQL - вызов хранимой процедуры не может быть частью SQL SELECT.Вместо этого вы должны создать функцию SQL и импортировать ее в свою модель EF .

1 голос
/ 30 июля 2011

Превратите HammingDistance в скалярную функцию, затем создайте либо хранимую процедуру для выбора, либо создайте представление.

Вы можете импортировать любой из них в свою модель и таким образом вернуть свои сущности.

В качестве альтернативы, создайте представление, которое добавляет новый вычисляемый столбец для расстояния Хэмминга, затем вы можете использовать столбец в предложении where - бит добавит дополнительное свойство к вашей сущности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...