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