在我的代码中有以下 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,我该如何避免这种情况?
最佳答案
你可以试试这个方法EntityFunction.AsNonUnicode ,如下
where ol.ordhead.ohcustno == login &&
(ol.ollastdoctype == EntityFunctions.AsNonUnicode("IN") ||
ol.ollastdoctype == EntityFunctions.AsNonUnicode("CR")) &&
ol.olstatus == "9"
这只是最后的希望,接下来是向微软报告错误。
关于c# - EF 4 在列类型为 varchar 的 SQL 中生成 UNICODE 字符串常量。如何避免?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5828621/