2011-05-11 7 views
10

私はインターネットを検索していると私はqueryover 元のwhere句に文字列関数を使用したい例えば 3.0のNHibernateのqueryoverの使用方法の例を見つけることができません。NHibernate QueryOverでSQL関数を使用できますか?

var item = Query.Where(x => x.Name.ToLower() == name.ToLower()).FirstOrDefault(); 

しかし、nhibernateがToLowerを理解できないので、これは機能しません。どのようにして方言を拡張できるのでしょうか?

答えて

9
session.QueryOver<Foo>() 
    .Where(Restrictions.Eq(
     Projections.SqlFunction("lower", NHibernateUtil.String, 
      Projections.Property<Foo>(x => x.Name)), 
     name.ToLower())) 

は、あなたが、これはパフォーマンスのために悪いかもしれないのSQLServerでUPPER()関数を使用してwhere句...(... FYIになりwhere lower(Name) = @p0

+0

こんにちは、本当に返事をいただきありがとうございます、あなたはこのソリューションをどれくらい長く探していたのか分かりません。ありがとう –

+0

@Ruben Monteiro問題はありませんが、私はQueryOverで作業するときにいくつかのCriteriaにミックスする必要があることがあります。 – dotjoe

0

私はそれが私が使用していたビルドに少なくとも働くと考えている。(バージョン3.0.0.4000)が...以下の私の例がある...

var reasons = _session.Query<Reason>(); 
var myReason = (from r in reasons 
       where r.IsCritical 
        && r.ReasonCode.ToUpper() == reasonCode.ToUpper() 
       select r).FirstOrDefault(); 

はそれに打撃を与え、それが動作するかどうか私に教えてあなたのため...

+0

ようなSQLを取得する必要) – Todd

+0

私はこのvar query = Session.GetISession()を試しました。QueryOver (); var item =(fDescription.ToLower()== description.ToLower()select f).List().FirstOrDefault );このエラーが発生しました。エフェクトf.Description.ToUpper()で認識されないメソッド呼び出し、3.1.0.4000の場合はnHibernateの私のバージョン、@Todd - 私はパフォーマンスの問題を知っていますが、このように実装する必要があります –

+0

興味深い...あなたの権利QueryOver構文を使用すると動作しません...私の推測はいつか修正されるでしょう...あなたのニーズに応じて、このためのQuery構文を使用することができます。次のように更新されました。 – Todd

関連する問題