2016-09-20 5 views
2

Я пытаюсь отобразить электронную почту в combobox, фильтруя по электронной почте. Моя проблема в том, что мои данные зашифрованы в таблице пользователей.LINQ to Entities не распознает метод 'System.String Decrypt (System.String, System.String)' метод

Когда я пытаюсь расшифровать это оно дает эту ошибку:

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

Как я могу решить эту ошибку?

Вот мой Lookup класс

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; 
      } 
+0

Не использовали 'String.Encrypt' и' String.Decrypt'. Но как насчет * шифрования * 'fText' перед запросом вместо * расшифровки *' x.UserVar01'? –

ответ

0

мне удалось получить решение это было только небольшая проблема. я полагаю, чтобы включить ToList()

ret.AddRange(_entities.Users.ToList().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)), 
           })); 

Теперь работает.

+2

Помните, что вы материализуете ** полное содержимое ** таблицы Users. Вы должны делать это только в том случае, если количество строк невелико. Оптимизация, которую вы можете сделать, - это выбрать нужные столбцы. – Maarten

2

Помните Linq к Entities запроса в конце транслируется в SQL нотации, но то, что ошибка говорит System.String Decrypt не поддерживается в то время, чтобы сделать этот перевод. Вот почему я боюсь, что вы не можете применить фильтр на стороне сервера, вам нужно будет сделать это в памяти. Для этого используется AsEnumerable метод расширения, чтобы сделать переход на Linq к объектам

ret.AddRange(_entities.Users.AsEnumerable().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)), 
          })); 
+1

Настоятельно рекомендуется добавить некоторую фильтрацию за пределы зашифрованного содержимого, чтобы вам не пришлось вытаскивать все записи назад, как написано. Однако это правильно, основываясь на размещенной фильтрации, так что не стучите в ответ, просто FYI OP вы должны добавить что-то, чтобы вы могли сначала фильтровать без дешифрования. – Tim

Смежные вопросы