2016-09-20 118 views
2

我試圖通過使用電子郵件過濾在combobox中顯示電子郵件。我的問題是我的數據在users表中被加密。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

請注意,您正在實現表用戶的**完整內容**。只有在行數很少的情況下才應該這樣做。您可以做的優化是僅選擇您需要的列。 – Maarten

2

記住一個LINQ到年底實體查詢轉換到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

相關問題