所以这里的情况:假设我有用来表示灵活的搜索类结构:抽象类型
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();