2011-09-09 62 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

相關問題