我在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");
谢谢!
答案 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。