【发布时间】: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