【问题标题】:The LINQ expression could not be translated. Either rewrite the query in a form that can be translated无法翻译 LINQ 表达式。以可以翻译的形式重写查询
【发布时间】:2021-09-28 05:24:27
【问题描述】:

我尝试运行一个查询来填充 Excel 表。这是它的代码。

                queryable = (from merchantTerminalDetails in context.Posh5ProdMerchantTerminalDetails
                             join merchantDetails in context.MerchantDetails
                             on merchantTerminalDetails.MerchantRecord equals merchantDetails.Id
                             join merchantContactDetails in context.Posh5ProdMerchantContactDetails
                             on merchantDetails.Id equals merchantContactDetails.MerchantRecord
                             where (merchantDetails.BypassAdviceVerification.ToString() == AdviceExemption &&
                             merchantDetails.BypassCreditVerification.ToString() == RefundExemption && merchantTerminalDetails.Tip.ToString() == TipAdjustment && merchantDetails.CoreBankingRecord.ToString() == Region)
                             select new OreDetails
                             {
                                 MerchantRecord = merchantTerminalDetails.MerchantRecord,
                                 LegalName = merchantDetails.LegalName,
                             
                                 PhoneNumber = merchantDetails.PhoneNumber,
                                 EmailAddress = merchantContactDetails.EmailAddress,
                                 TerminalId = merchantTerminalDetails.TerminalId,
                          


                             }).AsQueryable();
            }

我注意到的是,当我删除 where (merchantDetails.BypassAdviceVerification.ToString() == AdviceExemption && merchantDetails.BypassCreditVerification.ToString() == RefundExemption && merchantTerminalDetails.Tip.ToString() == TipAdjustment && merchantDetails.CoreBankingRecord.ToString() == Region) 时,我的查询有效并且我可以生成我的 excel 文件,但不幸的是我无法使用我的参数进行过滤。现在我确实查看了我在这里找到的答案 Migrating from EF Core 2 to EF Core 3 但我似乎无法弄清楚如何修复我的 where 语句以使其正常工作。

任何帮助将不胜感激

【问题讨论】:

  • 异常是否为您提供了有关无法翻译内容的详细信息?你说如果你删除整个where... 子句它可以工作,你有没有试过删除它的部分,看看哪些中断,哪些没有?您正在使用哪个 EF 提供商,例如SQL Server、Postgres 等?
  • 对于所有 ToString 的内容,请考虑更改 c# 变量的类型以匹配数据库中的类型,而不是相反
  • @ZacFaragher 它的 SQL 服务器,我已经尝试删除它的部分。任何时候都有休息的地方
  • @CaiusJard 我正在尝试这个

标签: c# entity-framework


【解决方案1】:

取决于类型:

merchantDetails.BypassAdviceVerification
merchantDetails.BypassCreditVerification
merchantDetails.CoreBankingRecord

以及 AdviceExemption、RefundExcemption 和 Region 的相关值,您可能需要转换变量以匹配基础类型。

例如,如果 MercerDetails 中的属性是 Enumerations 并且您传递给方法的值是来自 UI 的带有这些枚举名称值的字符串,则 EF 将无法翻译 Enumeration(通常存储在DB as an Int) 到要比较的字符串。

相反,将字符串值转换为它们各自的枚举:

BypassAdviceVerification adviceExemptionEnum = Enum.Parse<BypassAdviceVerification>(AdviceExemption);

等等。对于枚举,然后更新 Linq 表达式以比较枚举:

merchantDetails.BypassAdviceVerification == adviceExemptionEnum

如果它们不是枚举而是其他一些翻译,则翻译字符串以匹配实体属性类型并将其用于比较,而不是尝试在 Linq 表达式中翻译类型。

Linq 表达式中的翻译可以在 EF Core 2 中工作,因为 EF Core 2 默认启用了客户端评估。这会在它诉诸客户端评估时产生警告,其中 EF Core 3 + 默认禁用它,而是产生错误。您可以选择打开客户端评估,您的查询将按预期工作,但客户端评估将导致严重性能问题的重大风险。 (类似于延迟加载的不良实施注意事项)

【讨论】:

    猜你喜欢
    • 2021-10-13
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 2021-10-14
    • 2020-06-16
    • 2020-05-21
    • 1970-01-01
    相关资源
    最近更新 更多