如何在NHibernate中引用SQL函数?

时间:2011-09-09 15:47:03

标签: oracle nhibernate mapping fluent

我在Oracle上使用Fluent NHibernate,我的问题是我必须在条件的每个字符串上应用lower()函数。我制作了自己的方言,而不是使用ols_lower的Oracle低级功能。数据库主要由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 个答案:

答案 0 :(得分:1)

nls_lower 不是Oracle方言中的注册函数 您可以查看 Oracle8iDialect 类中的代码库。 在这种情况下,您必须注册自己的扩展。看看here

当您注册了您的方言扩展名时,您应该能够这样称呼它:

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>();

答案 1 :(得分:0)

您可以定义自定义SQL以加载实体。请参阅here