Entity Framework Как указать тип параметра в сгенерированном SQL (SQLServer 2005) Nvarchar vs Varchar - PullRequest
1 голос
/ 03 июня 2010

В структуре сущностей у меня есть сущность «Клиент», сгенерированная из базы данных. Существует свойство с именем «Account», которое определяется в модели хранения как:

 <Property Name="Account" Type="char" Nullable="false"  MaxLength="6" /> 

А в Концептуальной модели как:

<Property Name="Account" Type="String" Nullable="false" />

Когда выписки выбора генерируются с использованием переменной для учетной записи, т. Е.

where m.Account == myAccount...

Entity Framework генерирует параметризованный запрос с параметром типа NVarchar (6). Проблема в том, что столбец в таблице является типом данных char (6). Когда это выполняется, происходит значительное снижение производительности из-за разницы типов данных. Учетная запись - это индекс в таблице, и вместо использования индекса я считаю, что сканирование индекса выполнено.

Кто-нибудь знает, как заставить EF не использовать Unicode для параметра и использовать вместо этого Varchar (6)?

Ответы [ 2 ]

2 голосов
/ 04 июня 2010

Я думаю, что нашел ответ на свой вопрос. Здесь http://blogs.msdn.com/b/adonet/archive/2010/05/10/improvements-to-generated-sql-in-net-4-0.aspx

В нем говорится об улучшениях в сгенерированном sql в EF 4.0. В частности это говорит

Предоставить механизм для эффективных запросов не в Юникоде Колонки

В .NET 3.5 всякий раз, когда константа или параметр был использован в LINQ to Entities запрос, мы рассматривали его как Unicode. В результате при сравнении константы для свойства, хранящегося в не-Unicode столбец на SQL Server, если был индекса по этому столбцу не было использовался.

Чтобы решить эту проблему, мы теперь генерируем неуникодные константы и параметры когда они используются в LINQ для Запросы сущностей в сравнении с столбцы не в Юникоде.

Я думаю, мне нужно обновить.

1 голос
/ 04 июня 2010

в окне свойств для поля есть 3 свойства, которые должны выполнять то, что вы запрашиваете: фиксированная длина, максимальная длина и Unicode; они находятся в группе «Фасеты» в окне свойств при выборе соответствующего поля в конструкторе.

В настоящее время я смотрю на EF4 и не уверен, существуют ли они в предыдущих версиях EF.

в XML все должно выглядеть так.

<Property Name="Account" Type="String" MaxLength="6" Unicode="false" FixedLength="true" Nullable="false" />
...