Member 10389383 Ответов: 1

LINQ to entities не распознает метод " system.string decrypt(system.string, system.string)", и этот метод не может быть переведен в выражение хранилища


Привет хорошим людям (разработчикам / программистам).

Дамы и господа, у меня тут проблема. Я пытаюсь отобразить электронную почту в combobox, фильтруя ее с помощью электронной почты. Моя проблема заключается в том, что мои данные зашифрованы в таблице пользователей.

Когда я пытаюсь расшифровать его, он выдает эту ошибку
LINQ to Entities does not recognize the method 'System.String Decrypt(System.String, System.String)' method, and this method cannot be translated into a store expression


Как я могу решить эту ошибку, у кого-нибудь есть хорошая идея, пожалуйста?

Вот мой класс поиска


public class Lookup
   {
       public long boundvalue { get; set; }
       public string boundtext { get; set; }
   }


Вот мой код для фильтрации

public IEnumerable<Lookup> getUser(string fText)
           {
               var ret = new List<Lookup>
                             {
                                 new Lookup
                                     {
                                         boundvalue = 0,
                                         boundtext = ""
                                     }
                             };
               if (!string.IsNullOrEmpty(fText))
               {
                   ret.AddRange(_entities.Users.Where(x =>EncDec.Decrypt(x.UserVar01.Trim().Replace("_",string.Empty),
                   Enums.EncDecSecKeyToString(Enums.EncDecSecKey.Email)).Contains(fText.Trim()))
                                .Select(select => new Lookup
                                {
                                    boundvalue = select.UserID,
                                    boundtext = EncDec.Decrypt(select.UserVar01.Trim().Replace("_", string.Empty),
                                    Enums.EncDecSecKeyToString(Enums.EncDecSecKey.Email)),
                                }));

               }
               return ret;
           }


Что я уже пробовал:

public IEnumerable

[no name]

Ошибка объясняется сама собой. Системные строки не имеют метода дешифрования.

1 Ответов

Рейтинг:
0

David_Wimbley

Так и с Linq to Sql, пока вызов вы не сделаете с помощью .Там, где он выполняется в базе данных, он будет пытаться быть преобразован в SQL.

Кстати об этой части:

_entities.Users.Where(x =>EncDec.Decrypt(x.UserVar01.Trim().Replace("_",string.Empty),
                   Enums.EncDecSecKeyToString(Enums.EncDecSecKey.Email)).Contains(fText.Trim()))
                                .Select(select => new Lookup
                                {
                                    boundvalue = select.UserID,
                                    boundtext = EncDec.Decrypt(select.UserVar01.Trim().Replace("_", string.Empty),
                                    Enums.EncDecSecKeyToString(Enums.EncDecSecKey.Email)),
                                }))


В рамках юридического лица, заявление вы работаете по существу выберите * из пользователей, где расшифровать(UserVar01.Отделка()) Например, " %fText%". Когда запрос linq не был выполнен, он попытается перевести эту функцию дешифрования в функцию SQL-запроса, и поскольку вы сделали эту дешифровку, именно поэтому вы получаете ошибку, которую видите.

Обходной путь для этого состоит в том, чтобы выполнить этот запрос каким-то образом, чтобы он работал против вашей БД. Вы можете сделать это, повторяя его через цикл foreach, или вы можете позвонить.Вызова метода toList(). В зависимости от размера вашей базы данных я не рекомендую вам звонить.ToList, как вы могли бы загрузить 100k записей, когда вам нужно только 10 из них. Но ... ToList call решает вашу насущную потребность, но у вас, вероятно, будет масса других проблем.

Таким образом, этот пример будет

_entities.Users.ToList().Where.


Однако я думаю, что вам, вероятно, придется переосмыслить свое хранилище данных и тот факт, что вам нужно расшифровать значения БД для сравнения с обычным текстовым значением. Обычно при шифровании вы храните зашифрованное значение, которое обычно не используется в критериях поиска. Или вы шифруете что-то, а затем, когда вам это нужно как часть критерия поиска или что-то еще, вы шифруете простые текстовые данные/хэшируете их, а затем сравниваете эти хэши (например, проверка пароля).