所以這裏的情況:假設我有用來表示靈活的搜索類結構:抽象類型
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>();
}
}
}
等,與不同類型的集合。
術語使用table-per-heirarchy進行映射,除了ConcreteValues
集合之外,它們映射到不同的表(字符串值表,int值表等)。
我的問題是 - 如何有效檢索SearchDefinition
的列表?對於收集SearchTerm
s我不能使用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!
如何做到這一點有什麼建議?
我添加了流暢的映射這裏 -
條款集合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();