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

时间:2015-03-09 12:27:05

标签: c# linq entity-framework linq-to-entities linq-to-objects

我正在使用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 个答案:

答案 0 :(得分:8)

由于哈希值应该在.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的密钥和上下文。第二个查询使用原始数据计算所需的输出。