2012-02-08 2 views
3

У меня есть класс, сопоставленный с представлением, и я ищу имена и фамилии для поиска записей пациентов. В итоге в конечном счете рассматриваются поля первого и последнего имени на столе пациента (возможно, другие также зависят от ввода). Когда критерии преобразуются в SQL, он вводит мои строки как параметры nvarchar. Я уже использовал type = "AnsiString" и length = "50" для моего сопоставления, но он все еще преобразует их в nvarchar, что приводит к поражению производительности по моему запросу.NHibernate преобразует строковые параметры в nvarchar вместо varchar. Как я могу остановить это?

<class name="PatientSearchResult" table="vw_PatientSearch" mutable="false" > 
    <id name="Id" type="Guid" column="PatientId"/> 

    <property name="MedicalRecordNumber" type="AnsiString" length="50" /> 
    <property name="Title" /> 
    <property name="FirstName" type="AnsiString" length="50" /> 
    <property name="MiddleName" /> 
    <property name="LastName" type="AnsiString" length="50" /> 
    <property name="Nickname" /> 
    <property name="Suffix" /> 
    <property name="DateOfBirth" /> 
    <property name="IsRestricted" /> 
    <property name="IsDeleted" /> 

    <component name="Address"> 
     <property name="StreetAddress1" /> 
     <property name="StreetAddress2" /> 
     <property name="City" /> 
     <property name="State" /> 
     <property name="PostalCode" /> 
    </component> 

    </class> 

SQL Profiler показывает выходной SQL, как с помощью параметров NVARCHAR и префиксов всех моих строк с N, чтобы бросить их.

Я что-то упустил? Есть ли что-то еще, что нужно сделать по критериям или сопоставлению? Кроме того, длина параметров также не является постоянной 50. Я использую NHibernate 2.1.

ответ

2

Попробуйте использовать атрибут SQL-типа в ваших отображений:

<property name="FirstName" length="50" /> 
    <column sql-type="varchar(50)" /> 
</property> 

Какие проблемы производительности вы с? Мне кажется маловероятным, что обработка строк как unicode будет сильно влиять на производительность.

+0

Спасибо за отзыв. Что касается проблем с производительностью, это результат SQL Server, использующего гораздо более низкий план выполнения, чем тот, который использует мой ручной SQL. Кастинг был красной селедкой. –

+0

Что делать, если тип столбца nvarchar? – numerah

+0

@numerah не уверен, как он отображается в XML, но я бы предположил, что есть также sql-type = "nvarchar (50)". Определенные типы строк ansi и non-ansi определены здесь https://github.com/nhibernate/nhibernate-core/tree/master/src/NHibernate/SqlTypes – AlexCuse

2

Попробуйте это

<property name="FirstName" length="50"> 
    <column name="first_name" sql-type="varchar(50)" /> 
</property> 
+0

Спасибо. Когда я пробовал это раньше, это не сработало. Это потому, что sql-type недоступен в теге , скорее он находится на теге . –