【问题标题】:Method cannot be translated into a store expression syntax error方法无法转换为存储表达式语法错误
【发布时间】:2015-03-09 12:27:05
【问题描述】:

我正在使用 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))
                                       };

//我尝试将in转换为如下所示的LINQ语法

//如何计算适用于LINQ to Entity的Hash值?

//方法

 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();
        }

【问题讨论】:

  • 这是不可能的,你必须在计算哈希之前调用 ToList()。
  • @JenishRabadiya 是否与下面的答案相同?请详细说明?

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


【解决方案1】:

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

【讨论】:

  • ValuemyStrings 的当前上下文中不存在 :(
  • 啊哈,对不起,谢谢,但还有一个问题,我的模型呢?正如问题一样,我尝试绑定值NewModel,因为我已经采用了这个模型类并且属性在其中。
  • 我在新模型之后尝试了给定模型,但出现错误:string 'a.Value , invalid initializer member decelerator
  • 我错过了 Value= t.value :) 非常感谢,还有其他方法吗?你也可以给我任何链接和线程来理解以上所有内容吗?详细编程:)
  • @ashish [这里很好地讨论了IEnumerable<T>IQueryable<T> 并使用AsEnumerable()IQueryable<T> 切换到IEnumerable<T>。您可以在单个查询中执行此操作,但不幸的是,AsEnumerable 不能很好地使用查询语法,而 Join 不能很好地使用流畅的语法,所以这样做可能是最易读的。它也非常高效,因为查询执行被延迟,这意味着中间结果不会占用额外的存储空间。
猜你喜欢
  • 2011-04-20
  • 1970-01-01
  • 2017-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多