2013-11-20 63 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語句越複雜,越可能有更多的子類...