具有多种类型的流畅NHibernate子类分页

时间:2013-11-20 21:50:25

标签: c# linq nhibernate fluent-nhibernate

我即将着手制定一个相当复杂的制图策略,我有一个难点,我不确定最佳音轨是什么......

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

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

我正在思考

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

但我不清楚这会如何转化,或者是否有更好的方式?

1 个答案:

答案 0 :(得分: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都会创建大量查询,外部加入所有子类型,并通过大量使用PK上的case语句来过滤结果。

...
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语句会使您可能拥有的子类越来越复杂......