EF 4 создает строковые константы UNICODE в SQL, где тип столбца - varchar. Как этого избежать?

В моем коде есть следующий фрагмент 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 секунд на том же входе. Если я вручную удалю префикс N из предложения IN и повторно запущу запрос в SSMS, время выполнения вернется к 3 секундам. Это, конечно, связано с тем, что оптимизатор запросов SQL Server не может получить преимущество индекса, потому что сравниваемые типы теперь разные (varchar vs nvarchar)

Может ли кто-нибудь объяснить мне, почему Entity Framework внезапно решает преобразовать мои константы в Unicode и как этого избежать?

6
задан abatishchev 1 September 2016 в 02:29
поделиться