【问题标题】:LINQ to Entities does not recognize the method 'System.Object get_Item(System.String)' Epicor10LINQ to Entities 无法识别方法“System.Object get_Item(System.String)”Epicor10
【发布时间】:2016-06-21 20:00:36
【问题描述】:

我在 Epicor10 中将一段代码转换为 C#。 板载编译器允许使用此代码,但是当它从我收到的 API 触发时:

LINQ to Entities 无法识别方法“System.Object get_Item(System.String)”方法,并且该方法无法转换为存储表达式。

我已将其范围缩小到 where 子句的这一部分:

&& string.Compare((string)Part_Row["ShortChar01"] ,(string)"None",true)!=0

它是这个 sn-p 的一部分:

 var ttRcvDtlRow = ttRcvDtl_iterator;
    foreach (var Part_iterator in (from Part_Row in Db.Part
                                   where string.Compare(Part_Row.Company, ttRcvDtlRow.Company, true) == 0
                                   && string.Compare(Part_Row.PartNum, ttRcvDtlRow.PartNum, true) == 0
                                   /*&& string.Compare((string)Part_Row["ShortChar01"] ,"None",true)!=0*/
                                                                     && string.Compare((string)Part_Row["ShortChar01"] ,(string)"None",true)!=0 
                                           select Part_Row))

关于如何修复的建议。我从其他帖子中了解到这种情况发生 b/c linq 正在将其发送到 SQL,并且在翻译(或类似的东西)中存在问题

索引器?

Erp.Tables.Part Part;
foreach (var ttRcvDtl_iterator in (from ttRcvDtl_Row in ttRcvDtl
                               where (string.Equals(ttRcvDtl_Row.RowMod, IceRow.ROWSTATE_ADDED, StringComparison.OrdinalIgnoreCase) || string.Equals(ttRcvDtl_Row.RowMod, IceRow.ROWSTATE_UPDATED, StringComparison.OrdinalIgnoreCase))
                               && String.IsNullOrEmpty(ttRcvDtl_Row.LotNum)
                               select ttRcvDtl_Row))

谢谢, 杰米

【问题讨论】:

  • Part_Row的类型是什么?你能显示索引器的代码吗?必须有办法将其重写为FirstOrDefault(expression)
  • 请编辑问题。 cmets 中的代码很难阅读。
  • 很抱歉,这是新的。
  • 现在应该以正确的格式出现
  • 尝试用索引器中的 LINQ 语句替换 Part_Row["ShortChar01"]。如果没有看到类模型,很难拼凑出你的代码是什么样子的。下一个问题是,ttRcvDtl 是什么?等等。

标签: linq


【解决方案1】:

“我从其他帖子中了解到,这种情况发生在 b/c linq 正在将其发送到 SQL 并且翻译出现问题”

这正是正在发生的事情。 EF 不知道如何将string.Compare 转换为 SQL 方法。

&& string.Compare((string)Part_Row["ShortChar01"] ,(string)"None",true)!=0

应该是

&& ((string)Part_Row["ShortChar01"]).ToLower() != "none"

根据您的 SQL Server 设置,您甚至不需要 ToLower(),因为您可以将所有字符串比较默认设置为不区分大小写。

【讨论】:

  • OP 得到的异常肯定不是由string.Compare 引起的,而是由Part_Row["ShortChar01"] 引起的('System.Object get_Item(System.String) aka indexer)
  • 是的,他的错误指向了这一点,但我确信这是由于 string.Compare。 EF 不知道如何处理(至少我上次使用 EF 时)。
  • 上次我用EF的时候那肯定是4.1之前的...真的是索引器。
猜你喜欢
  • 1970-01-01
  • 2019-08-18
  • 1970-01-01
  • 2013-04-07
  • 2012-04-22
  • 1970-01-01
  • 2017-01-02
  • 1970-01-01
相关资源
最近更新 更多