我即将着手制定一个相当复杂的制图策略,我有一个难点,我不确定最佳音轨是什么......
基本上,每个子类架构有一个表,有四个子类。我正在使用围绕NHibernate的标准存储库模式(现在),这可能不适合使用LINQ提供程序(为什么我可能稍后将其更改为缓存和延迟加载来自我的映射的支持)。
我的要求是我必须一次拉出两个不同的子类列表,以便我可以在查询集上实现分页。我不知道该怎么做......
我正在思考
的内容Session.Query<Superclass>().Where(x => x is SubClass1 || x is SubClass2).Skip().Take();
但我不清楚这会如何转化,或者是否有更好的方式?
答案 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语句会使您可能拥有的子类越来越复杂......