LINQ to Entities无法识别方法' System.String Decrypt(System.String,System.String)'方法

时间:2016-09-20 20:34:41

标签: c# entity-framework linq encryption ienumerable

我正在尝试通过使用电子邮件过滤来显示combobox中的电子邮件。我的问题是我的数据在用户表中加密了。

当我尝试解密它时会出现此错误:

  

LINQ to Entities无法识别方法' System.String Decrypt(System.String,System.String)'方法,并且此方法无法转换为商店表达式

如何解决此错误?

这是我的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;
            }

2 个答案:

答案 0 :(得分:2)

请记住,最后将Linq to Entities查询转换为sql表示法,但在执行该转换时,错误所指的是System.String Decrypt。这就是为什么我担心你不能在服务器端应用过滤器,你需要在内存中进行。为此,请使用AsEnumerable扩展方法切换到Linq to Objects

   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 :(得分: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)),
                                 }));

现在正在运作。