c# - EF 4 在列类型为 varchar 的 SQL 中生成 UNICODE 字符串常量。如何避免?

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

在我的代码中有以下 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/

相关文章:

SQL CASE 和局部变量

sql - 想要显示 sql server 中 12 个月的名称

sql - 如何将 SQL Server 数据库中的所有日期时间记录更新为 UTC 时间?

c# - 来自 C# 的 Windows Defender 防病毒扫描 [AccessViolation 异常]

c# - CompositionTarget.Rendering 未调用?

c# - 多对多(自相关)特定订单 Entity Framework

entity-framework - 在 Entity Framework 中将int转换为字符串

c# - unity3d : The type "task" exist in both Unity. 任务和mscorelib

c# - 使用 LINQ to SQL 进行动态查询

c# - Linq VAR 和类型化对象