2011-09-09 18 views
1

我在Oracle上使用Fluent NHibernate,我的问题是我必须在每个条件中的每个字符串上应用lower()函数。我用我自己的方言,而不是甲骨文低功能正在使用nls_lower。数据库主要由Microsoft Dynamics AX使用,此功能可提高性能。在这样的标准查询中,一切工作正常:如何在NHibernate中引用SQL函数?

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

您可以自定义SQL加载实体。见here

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

我知道这不是注册功能。就像我说过的,我创建了Oracle10gDialect的子类,并在其中注册了该函数并覆盖了标准的低级函数。这适用于标准查询。问题是我如何使用sql函数(在这种情况下nls_lower)从引用生成的查询。 – oFce

+0

@oFce:抱歉我迟到的回复。在我的回答中,我向您展示了您可以在QueryOver中使用它的方式。还没有尝试过,但它应该工作。 – LeftyX

+0

感谢您的回复。这将生成仅适用于属性Name的nls_lower。我想要它的所有字符串属性。例如我有设置实体引用实体用户。对于这2个SQL查询将被生成 - 实体用户和实体设置受用户ID限制。我希望在实体设置条件下应用nls_lower。 – oFce

相关问题