ので、ここでの状況です:検索用語が異なるフィールドを参照することができるので、用語の各タイプがあり、今フェッチ戦略
public class SearchDefinition
{
public virtual string Name {get; set;}
public virtual IEnumerable<SearchTerm> Terms {get; set;}
}
public abstract class SearchTerm
{
public virtual Operator Op {get; set; } //i.e 'In', 'Not in', 'Contains' etc..
public abstract IEnumerable<object> CompareValues {get; } //the values against which the search is performed. for example- 'in (2,6,4)', 'contains ('foo', 'blah')'.
}
:私は柔軟な検索を表すために使用されるクラス構造を持っていると仮定独自のクラス:
public class NameSearchTerm : SearchTerm
{
public virtual IEnumberable<string> ConcreteValues {get; set;}
public override IEnumberable<object> CompareValues
{
get
{
return ConcreteValues.Cast<object>();
}
}
}
など、さまざまな種類のコレクションがあります。
異なるテーブル(文字列値のテーブル、int値のテーブルなど)にマップされているConcreteValues
コレクションを除き、用語はテーブルごとの階層を使用してマップされます。
私の質問is-効率よくSearchDefinition
のリストを取得しますか? SearchTerm
のコレクションでは、私はselect
戦略(選択N + 1になります)を使用することはできません。
しかし、正しいクエリを送信している間、JoinQueryOver
またはJoinAlias
を使用して取り出し、コレクションを移入しません:
var definitions = session.QueryOver<SearchDefinition>()
.Where(/*condition*/)
.JoinAlias(d=> d.Terms,() => termsAlias)
.List(); //sends a correct, joined query which fetches also the terms from the terms table
Assert.IsTrue(NHibernateUtil.IsInitialized(definitions[0].Terms)); //THIS FAILS!
これを行う方法上の任意の提案を?
私は流暢なマッピングを追加しているhere-
SearchDefinition
クラス内の用語集:
mapping.HasMany(x => x.Terms)
//.Not.LazyLoad()
.Fetch.Subselect()
.Cascade.AllDeleteOrphan()
.Cache.ReadWrite();
(すべての用語クラスについても同様)IntSearchTerm
クラス内の具体的な値のコレクション:
mapping.HasMany<int>(t=> t.ConcreteValues).Table("TermsIntValues").Element("IntValue")
//.Not.LazyLoad()
.Fetch.Subselect()
.Cascade.AllDeleteOrphan();