【问题标题】:Why does ToUpper cause Entity Framework 5.0 to switch to Unicode?为什么 ToUpper 会导致 Entity Framework 5.0 切换到 Unicode?
【发布时间】:2014-03-14 22:51:00
【问题描述】:

假设我有一个这样的 EF 查询:

Orders.Where(z => z.OrderDesc == "SOME VALUE")

这很好用,并生成如下查询:

SELECT [Extent1].[OrderDesc] AS [OrderDesc]
       [Extent1].[OtherColumns] AS [OtherColumns]
FROM   [dbo].[Order] AS [Extent1]
WHERE  'SOME VALUE' = [Extent1].[OrderDesc]

但是,如果您将查询更改为:

Orders.Where(z => z.OrderDesc.ToUpper() == "SOME VALUE")

那么你的结果是这样的:

SELECT [Extent1].[OrderDesc] AS [OrderDesc]
       [Extent1].[OtherColumns] AS [OtherColumns]
FROM   [dbo].[Order] AS [Extent1]
WHERE  N'SOME VALUE' = (UPPER([Extent1].[OrderDesc]))

请注意,“SOME VALUE”现在前面有一个 N。这会导致严重的performance problem

那么,为什么在调用 ToUpper 时 EF 会转换为 Unicode?​​strong>

OrderDesc 是一个 varchar(200),UPPER 可以返回一个 varchar。为什么做 ToUpper 会导致 EF 想要切换到 Unicode?​​p>

注意: 我知道 SQL Server 通常不区分大小写,因此调用 ToUpper 进行比较没有什么意义。 但我还是想知道 EF 为什么要这样做。

【问题讨论】:

  • SQL Server 不区分大小写。您分配一个不区分大小写的排序规则。通常使用不区分大小写。

标签: .net sql-server entity-framework entity-framework-5


【解决方案1】:

据我从 EF 源代码中可以理解,是否生成 Unicode 参数取决于实体的属性。这里的“属性”是指映射模型中的属性。每个属性都有一个 EDM 类型(实体数据模型),它包含比 .Net 类型更多的元数据,其中一个是数据库中映射列的类型,包括 Unicode。

但是在这种情况下,方法调用ToUpper 会破坏与属性的直接链接。毕竟,一个方法调用可能有多个参数,因此推断匹配的参数类型可能太复杂(或者:认为不值得努力)。统一码。所以 EF 似乎在谨慎方面犯了错误并选择了 Unicode。

但是,除了这些推测性的考虑之外,在您的情况下,参数是否为 Unicode 是无关紧要的。通过过滤处理过的值,而不是原始值,查询优化器无论如何都不能选择索引。过滤器表达式不是sargable

【讨论】:

    猜你喜欢
    • 2023-01-14
    • 1970-01-01
    • 2021-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多