2013-11-20 32 views
0

我即将踏上一个相当复杂的映射策略,我有一个棘手的问题是我不知道的最佳路径是什么...功能NHibernate子分页与多种类型的

基本上,我有一个每个子类架构有四个子类的表。我正在使用NHibernate的标准存储库模式(现在),这可能不适合整齐地使用,它使用LINQ提供程序(为什么我可能稍后将其更改为缓存和从我的映射延迟加载东西支持的一部分)。

我的要求是,我必须一次拉两个不同的子类的列表,以便我可以在查询集上实现分页。我不知道该怎么做......

我想沿着

Session.Query<Superclass>().Where(x => x is SubClass1 || x is SubClass2).Skip().Take(); 

线的东西,但我不清楚如何将转换,或是否有更好的办法?

+0

您是否希望通过结果在这两个表和页上生成连接? –

+0

是的。我改回了这个例子,让它更多地使用我的资源库提取的NHibernate方式。我的问题是,我有4个子类,我只想拉2 ...否则只是在超类查询会为我做,但这一块是困在我。 –

回答

1

其实你的示例查询正是你如何做到的。当然,这取决于你是否正确使用一个ClassMap和几个SubclassMaps(流利的nhibernate)来映射你的超类和子类。

您可以通过使用is声明

var result = session.Query<LifeForm>().Where(t => t is Cat || t is Programmer).Skip(5).Take(10).ToList(); 

你甚至可以做的查询,你就分型特定属性过滤做这样的事情查询不同的子类型:

var result2 = session.Query<LifeForm>() 
    .Where(t => t is Cat || t is Programmer) 
    .Where(p=>((p as Cat).Cuteness > 5) ||((p as Programmer).IsSenior == true)).ToList(); 

的缺点这是nhibernate创建巨大的查询左外部加入全部子类型,无论您正在使用哪些子类型,并通过大量使用case语句过滤结果e PK。

... 
where 
case when csclifefor0_3_.Id is not null then 3 
when csclifefor0_2_.Id is not null then 2 
when csclifefor0_4_.Id is not null then 4 
when csclifefor0_5_.Id is not null then 5 
when csclifefor0_9_.Id is not null then 9 
when csclifefor0_10_.Id is not null then 10 
... 

虽然这可能不是问题。生成的SQL语句越复杂,越可能有更多的子类...