代码之家  ›  专栏  ›  技术社区  ›  Neo

方法无法转换为存储表达式语法错误

  •  6
  • Neo  · 技术社区  · 10 年前

    我正在使用LINQ to Entity并收到错误

    方法无法转换为存储表达式

    var myStrings = from keys in keyTable
                                           join values in valuesTable
                                               on keys.ID equals values.FK_TableKey
                                           select new NewModel
                                           {
                                               Value = values.Value,                                        
                                               Hash = CalculateHash(string.Format("{0}_{1}", keys.Key, keys.Context))
                                           };
    

    //我试图转换成LINQ语法,如下所示

    //如何计算将在LINQ to Entity上工作的哈希值?

    //方法

     public string CalculateHash(string input)
            {
                if (input == null)
                    return null;
    //calculate MD5 hash
                var md5 = System.Security.Cryptography.MD5.Create();
                byte[] inputBytes = System.Text.Encoding.UTF8.GetBytes(input);
                byte[] hash = md5.ComputeHash(inputBytes); 
    
                var sb = new StringBuilder();
                foreach (byte t in hash)
                    sb.Append(t.ToString("P2"));
    
                return sb.ToString();
            }
    
    1 回复  |  直到 10 年前
        1
  •  8
  •   Sergey Kalinichenko    10 年前

    由于应该在.NET端计算哈希值,因此可以添加 AsEnumerable() 在生成“原始数据”的部分之后调用,然后在RDBMS之外计算其余部分,如下所示:

    var rawStrings = from keys in keyTable
                    join values in valuesTable
                    on keys.ID equals values.FK_TableKey
                    select new {
                        Value = values.Value,                                        
                        keys.Key,
                        keys.Context
                    };
    var myStrings = rawStrings.AsEnumerable().Select(t => new NewModel {
         Value = t.Value,
         Hash = CalculateHash(string.Format("{0}_{1}", t.Key, t.Context))
    });
    

    第一个查询在RDBMS端运行,并生成用于计算 Hash 第二查询使用原始数据来计算期望的输出。