2016-06-21 100 views
0

我有一塊代碼在Epicor10中轉換爲C#。 板載編譯器允許使用此代碼,但是當它從API中被觸發時,我會收到:LINQ to Entities無法識別方法'System.Object get_Item(System.String)'Epicor10

LINQ to Entities不能識別方法System.Object get_Item(System.String)方法,並且此方法不能被翻譯成商店表達。

我把它縮小到我的where子句中的這一部分:

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

正是這個片段的一部分:關於如何解決

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)) 

感謝, JM

+1

Part_Row的類型是什麼?你能顯示索引器的代碼嗎?必須有方法將其重寫到'FirstOrDefault(表達式)'中。 –

+0

請編輯問題。評論中的代碼很難閱讀。 –

+0

對不起,新的。 – JMar

回答

0

「我從其他的帖子瞭解到,出現這種情況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將(),你可以將所有的字符串比較是區分默認情況下不區分大小寫。

+4

OP得到的異常絕對不是由'string.Compare'引起的,而是由'Part_Row ['ShortChar01']'(''System.Object get_Item(System.String)'又名索引器)引起的 –

+0

是的,他的錯誤指向,但我相信這是由於string.Compare。 EF不知道如何處理(至少在上次使用EF時)。 – Spivonious

+0

*上次我使用EF *這肯定是4.1以前的版本......它確實是索引器。 –

相關問題