2011-09-09 7 views
1

私はOracle上でFluent NHibernateを使用しています。私の問題は、条件のすべての文字列にlower()関数を適用する必要があることです。私は自分の方言を作ったが、代わりにOracleの下位機能が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のサブクラスを作成して、この関数を登録し、標準のlower関数をオーバーライドしました。これは標準的なクエリで機能します。質問は、SQL関数(この場合はnls_lower)を参照から生成されたクエリに使用する方法です。 – oFce

+0

@oFce:遅く返事を申し訳ありません。私の答えでは、QueryOverで使用できる方法を示しました。それを試していないが、それは動作するはずです。 – LeftyX

+0

お返事ありがとうございます。これにより、プロパティNameに対してのみnls_lowerが適用されます。私はすべての文字列プロパティのためにそれをしたい。たとえば、エンティティUserを参照するSettingsエンティティがあります。このために、エンティティユーザと、ユーザからのIDによって制約されたエンティティ設定に対して、SQLクエリが生成されます。エンティティ設定の条件にnls_lowerを適用したいと思います。 – oFce

関連する問題