Исключение Linq To Entities не распознает метод и не может быть преобразовано в выражение хранилища. - PullRequest
6 голосов
/ 13 июля 2011

Может кто-нибудь дать объяснение, почему я получаю эту ошибку с моим кодом LINQ?

LINQ to Entities не распознает метод 'System.String GenerateHashWithSalt (System.String, System.String) 'метод и это метод не может быть переведен в выражение магазина.

var query = (from u in context.Users
                         where 
                         u.Password ==  
                          GenerateHashWithSalt(password, GetUserID(username))
                         select u).Count();

Ответы [ 3 ]

14 голосов
/ 13 июля 2011

Вы пытаетесь передать метод в EF, который пытается преобразовать этот метод в известную команду SQL. SQL не знает о GenerateHashWithSalt(System.String, System.String)
Сначала вы должны присвоить результат переменной, а затем сгенерировать свой Linq для Entity Query.

Пример

var hashedPassword = GenerateHashWithSalt(password, GetUserID(username));
var user = (from p in Users
        where p.Password == hashedPassword
        select p).FirstOrDefault();
0 голосов
/ 13 июля 2011

Похоже, это недостаток LINQ to Entities

Как говорит Джетро, ​​и ссылка выше показывает пример, вам нужно преобразовать его в то, о чем знает SQL.

0 голосов
/ 13 июля 2011

LINQ провайдеры просматривают ваше дерево выражений и пытаются из него сгенерировать эквивалентный TSQL (и т. Д.).Это работает только для распознанных методов или распознанных сценариев выражений.

Он не может посмотреть произвольный метод в вашем коде C # и выполнить его в базе данных.

Однако!Вы могли бы упростить запрос для этого:

var hash = GenerateHashWithSalt(password, GetUserID(username);
var count =context.Users.Count(u => u.Password == hash);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...