1

これまでのところ、ローカル変数またはローカルプロパティをエイリアスとして使用できることはわかっています。

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);

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

4

2 に答える 2

7

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

QueryOverはCriteriaの強く型付けされたバージョンであり、Criteriaではエイリアスは文字列値でした。

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

ただし、エイリアスを変数に割り当てる必要があるため、エイリアスを作成するだけです。

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");

NHForgeのドキュメントから、次のように書かれています。

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

15.5。エイリアス

従来のICriteriaインターフェースでは、エイリアスは「マジックストリング」を使用して割り当てられますが、その値はオブジェクトドメインの名前に対応していません。たとえば、エイリアスが.CreateAlias( "Kitten"、 "kittenAlias")を使用して割り当てられている場合、文字列"kittenAlias"はドメイン内のプロパティまたはクラスに対応していません。

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

QueryOverの各LambdaExpression関数には、エイリアスの使用を可能にする対応するオーバーロードと、サブQueryOverを作成せずにエイリアスを使用して関連付けをトラバースする.JoinAlias関数があります。

したがって、メソッドのスコープ内で変数を使用することに固執します。

于 2011-08-01T03:31:25.340 に答える
2

同様の問題を解決する必要があり、エイリアスの命名規則を決定しました。次に、エイリアスを再利用する必要がある場合は、GetCriteriaByAlias()を使用してエイリアスを確認し、存在しない場合は追加します。選択したプロジェクションが異なる場合は、エイリアスを再利用できると非常に便利です。この方法は、誰かが命名規則を無視した場合でも問題がありますが、単体テストでそれを検出する必要があります。

Project aProject = null;
if (root.UnderlyingCriteria.GetCriteriaByAlias("aProject") == null)
    root.JoinAlias(i => i.Project, () => aProject);
于 2012-05-02T23:30:41.043 に答える