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

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

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

Ответы [ 4 ]

13 голосов
/ 29 апреля 2011

вы можете попробовать этот метод EntityFunction.AsNonUnicode , как следует

where ol.ordhead.ohcustno == login && 
   (ol.ollastdoctype == EntityFunctions.AsNonUnicode("IN") || 
   ol.ollastdoctype == EntityFunctions.AsNonUnicode("CR")) && 
   ol.olstatus == "9"

Это только последняя надежда, следующий - сообщить об ошибке в Microsoft.

2 голосов
/ 07 августа 2011

Обходной путь EntityFunction.AsNonUnicode на самом деле весьма ограничен, он работает только тогда, когда предоставленное значение является литералом или строкой:

System.NotSupportedException: метод 'System.String AsNonUnicode (System.String) 'поддерживается только в LINQ to Entities когда аргумент является строковой переменной или литералом.

Это серьезная проблема в EF4.1, которая также была задокументирована здесь: http://connect.microsoft.com/VisualStudio/feedback/details/650410/entity-framework-contains-still-defaulting-to-unicode-for-varchar-fields

Пока это не исправлено в самом EF, нет обходного пути, кроме перехвата запроса и замены синтаксиса вручную с помощью чего-то вроде EFTraceProvider .

Brutal.

1 голос
/ 04 апреля 2013

Эта проблема была официально решена в последних версиях EF. Вы можете определить тип столбца, используя DataAnnotations. Надеюсь, это кому-нибудь поможет!

См. Этот ответ: Тип столбца аннотации данных EF

0 голосов
/ 26 ноября 2011

Это была проблема до выпуска ODP.net Beta 2, но с выходом Beta3 ODP.net 4.112.2.50 эта проблема была решена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...