2011-08-01 5 views
1

私は、ローカル変数またはローカルプロパティは、私が可能であり、他のどのようなオプションを知りたいので、NHibernate QueryOverエイリアスとして使用できるものは何ですか?

ClassA _aliasA; 
_session.QueryOver(x => x.ClassA,() => _aliasA); 

または

ClassA AliasA { get; set; } 
_session.QueryOver(x => x.ClassA,() => AliasA); 

などの別名として使用することができることがこれまでにわかっています。同様に、外部クラスのプロパティは有効なオプションですか?

class ClassGenericAliases 
{ 
    ClassA Class { get; set; } 
} 

_session.QueryOver(x => x.ClassA,() => ClassGenericAliases.ClassA); 

スタティックはエイリアスとして使用できますか? エイリアスを宣言するための他のオプションはありますか?

答えて

7

エイリアスを使用するメソッドの範囲外のエイリアスには、何も使用しないことをお勧めします。

QueryOverはCriteriaの厳密に型指定されたバージョンです。Criteriaでは、別名は文字列値でした。

IList cats = sess.CreateCriteria(typeof(Cat)) 
    .CreateAlias("Kittens", "kt") 
    .CreateAlias("Mate", "mt") 
    .Add(Expression.EqProperty("kt.Name", "mt.Name")) 
    .List(); 

しかし、今では私達はちょうどそれのための1つを作成して変数に別名を割り当てる必要があります:NHForgeのドキュメントから

Cat catAlias = null; 
Kitten kittenAlias = null; 

IQueryOver<Cat,Cat> catQuery = 
    session.QueryOver<Cat>(() => catAlias) 
     .JoinAlias(() => catAlias.Kittens,() => kittenAlias) 
     .Where(() => catAlias.Age > 5) 
     .And(() => kittenAlias.Name == "Tiddles"); 

、それは次の言葉:

http://nhibernate.info/doc/nh/en/index.html#queryqueryover-aliases

15.5。エイリアス

伝統的なICriteriaインターフェイスでは、エイリアスは 'magic strings'を使用して割り当てられますが、その値はオブジェクトドメインの の名前に対応しません。たとえば、 .CreateAlias( "Kitten"、 "kittenAlias")を使用してエイリアスが割り当てられた場合、文字列 "kittenAlias"は にドメインのプロパティまたはクラスに対応しません。

QueryOverでは、エイリアスは空の変数を使用して割り当てられます。 変数はどこでも宣言できます(ただし、実行時にはnullにする必要があります)。 コンパイラは、変数に対して構文をチェックできます。 が正しく実行されますが、実行時に変数が評価されません(エイリアスのプレースホルダとして が使用されています)。

QueryOverの各ラムダ式関数は、エイリアスの使用を可能にする対応 過負荷、およびサブQueryOverを作成せずに別名を使用 トラバースアソシエーションに.JoinAlias機能を有しています。

このように、メソッドのスコープ内の変数を使用するだけです。

+0

これらのエイリアスを再利用する方法を探しています。それは良い習慣ではないのですか?それらの結合を何度も書き直さなければならないことは、何度も繰り返されます。 – Jonn

+0

あなたは複雑な結合をあまり多くはしてはいけません。そうでなければ、解決しようとしていることを二重にするべきだと思います。 Eagerフェッチをクエリーに再利用するためのフェッチ戦略を書くことができます。それらのクエリーを再利用できるようにすることはできません。メソッドからIQueryOverを返し、それに基準を追加することができます。しかし、一般的には、エイリアスを再利用可能にすることをお勧めしません。 – Phill

2

同様の問題を解決する必要があり、エイリアス命名規則を決定しました。次に、エイリアスを再利用する必要がある場所でGetCriteriaByAlias()を使用してエイリアスをチェックし、エイリアスがない場合は追加できます。 エイリアスを再利用できることは、選択肢が異なれば非常に便利です。この方法は、誰かが命名規則を無視しても問題はありませんが、単体テストでそれを選択する必要があります。

Project aProject = null; 
if (root.UnderlyingCriteria.GetCriteriaByAlias("aProject") == null) 
    root.JoinAlias(i => i.Project,() => aProject); 
+0

私は同様の解決策に終わった。実際にそれを使用してほぼ一年後、私はあなたが何度もデザインと戦うことになると言わなければならないでしょう。それは本当ですが、単体テストを書く際の規律はここで多くの助けになります。私たちが持っているものは、まったく再利用できないよりも簡単です。私はちょうど私がもう一度それをすることだったことを知っている、私はNhibのフレームワークと戦うように強制しないものを探すだろう – Jonn