【问题标题】:EF 4 produces UNICODE string constans in SQL where the column type is varchar. How to avoid?EF 4 在列类型为 varchar 的 SQL 中生成 UNICODE 字符串常量。如何避免?
【发布时间】:2011-04-29 06:19:52
【问题描述】:

在我的代码中,我有以下 L2E 查询片段:

where ol.ordhead.ohcustno == login && (ol.ollastdoctype == "IN") && ol.olstatus == "9"

这将转换为以下 SQL 片段:

WHERE ([Extent8].[ohcustno] = @p__linq__1) AND (''IN'' = [Extent7].[ollastdoctype]) AND (''9'' = [Extent7].[olstatus]) ...

在某个输入上,查询执行 3 秒。我以这种方式更改查询:

where ol.ordhead.ohcustno == login && (ol.ollastdoctype == "IN" || ol.ollastdoctype == "CR") && ol.olstatus == "9"

由此产生的SQL变化如下:

WHERE ([Extent6].[ohcustno] = @p__linq__1) AND ([Extent5].[ollastdoctype] IN (N''IN'',N''CR'')) AND (''9'' = [Extent5].[olstatus]) ...

请注意,由于某些奇怪的原因,Entity Framework 决定将我的 IN 和 CR 转换为 unicode。结果是查询现在在同一输入上执行 6 秒。如果我从 IN 子句中手动删除 N 前缀并在 SSMS 中重新运行查询,则执行时间会回到 3 秒。这当然是因为 SQL Server 查询优化器无法利用索引,因为比较类型现在不同(varchar 与 nvarchar)

谁能解释一下为什么 Entity Framework 突然决定将我的常量转换为 unicode 以及如何避免它?

【问题讨论】:

  • 你能检查一下你的存储模型,看看你的列是否正确地将 varchar 反映为类型而不是 nvarchar
  • @Akash Kava:这是我做的第一件事。另请注意,我没有更改存储模型,但在第一个查询中 EF 产生非 unicode 常量,而在第二个查询中它是 unicode 常量。

标签: c# entity-framework tsql entity-framework-4


【解决方案1】:

你可以试试这个方法EntityFunction.AsNonUnicode,如下

where ol.ordhead.ohcustno == login && 
   (ol.ollastdoctype == EntityFunctions.AsNonUnicode("IN") || 
   ol.ollastdoctype == EntityFunctions.AsNonUnicode("CR")) && 
   ol.olstatus == "9"

这只是最后的希望,接下来是向微软报告错误。

【讨论】:

    【解决方案2】:

    EntityFunction.AsNonUnicode 解决方法实际上非常有限,它仅在提供的值是文字或字符串时才有效:

    System.NotSupportedException:方法'System.String AsNonUnicode(System.String)' 仅在 LINQ to Entities 中受支持 当参数是字符串变量或文字时。

    这是 EF4.1 中的一个严重问题,此处也有记录: http://connect.microsoft.com/VisualStudio/feedback/details/650410/entity-framework-contains-still-defaulting-to-unicode-for-varchar-fields

    在 EF 本身解决此问题之前,除了拦截查询并使用 EFTraceProvider 等手动替换语法之外,没有其他解决方法。

    野蛮。

    【讨论】:

      【解决方案3】:

      此问题已在最新的 EF 版本中正式解决。您可以使用 DataAnnotations 定义列类型。希望这对某人有帮助!

      看到这个答案:EF Data Annotations Column Type

      【讨论】:

        【解决方案4】:

        在 ODP.net Beta 2 发布之前,这是一个问题,但随着 ODP.net 4.112.2.50 的 Beta3 发布,这个问题得到了解决。

        【讨论】:

          猜你喜欢
          • 2013-03-10
          • 1970-01-01
          • 1970-01-01
          • 2014-02-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-26
          相关资源
          最近更新 更多