В моем коде есть следующий фрагмент 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 и как этого избежать?