Как использовать функцию SQL в качестве ссылки в NHibernate? - PullRequest
1 голос
/ 09 сентября 2011

Я использую Fluent NHibernate в Oracle, и моя проблема заключается в том, что я должен применять функцию lower () к каждой строке в тех условиях. Я сделал свой собственный диалект, который использует нижнюю функцию Oracle nls_lower. База данных в основном используется Microsoft Dynamics AX, и эта функция повышает производительность. В стандартном запросе, как это все работает нормально:

session.QueryOver<User>()
    .Where(x => x.Name.lower() == userName.lower())
    .SingleOrDefualt<User>();

Но как я могу применить эту функцию lower () в ссылках? Я не могу найти ничего подходящего для этого, и я ожидаю, что это можно сделать как-нибудь. Я ожидал что-то подобное в классе картирования, но не могу найти это:

References<Settings>(x => x.Settings)
    .Column("SettingId").lower();

Я не хочу немедленно преобразовывать мою строку в нижний регистр, но мне действительно нужно сгенерировать запрос, подобный этому:

select * from User where nls_lower(Name) == nls_lower("somename");

Спасибо!

Ответы [ 2 ]

1 голос
/ 10 сентября 2011

nls_lower не является зарегистрированной функцией на диалекте Oracle.
Вы можете посмотреть базу кода в классе Oracle8iDialect .В этой ситуации вы должны зарегистрировать свой собственный добавочный номер.Посмотрите здесь .

Когда вы зарегистрируете расширение своего диалекта, вы сможете назвать его следующим образом:

var filter1 = Restrictions.Eq(
    Projections.SqlFunction("nls_lower", NHibernateUtil.String,
    Projections.Property<User>(x => x.Name)), userName.ToLower());

var user = session.QueryOver<User>();
user.Where(myFilter)
    .SingleOrDefualt<User>();
0 голосов
/ 12 сентября 2011

Вы можете определить пользовательский SQL для загрузки сущностей. Смотрите здесь .

...