2012-01-17 99 views
1

在我的應用程序中,我有許多文章,每篇文章都屬於一個或多個類別。在我的主頁上,我想列出所有類別及其包含的文章總數,其中我希望顯示前X個文章描述(基於文章發佈時間)。它會看起來像下面NHibernate - 獲取每個類別中的類別,數量和前5個項目

Home Decorating (105) 
- How to fix Windows 
- How to fix Curtains 
- How to fix Doors 
- How to fix Counter tops 
- How to fix sofas 

我的映射是非常簡單,可以從文章或類別進行遍歷 - 這兩者有NHibernate的映射文件。

我可以很容易地從存儲過程中做到這一點,但爲了學習的目的想要通過NHibernate完成這一點,並想知道是否有一種有效的方法來做到這一點,或者如果我總是要結束多個查詢。

有誰知道這可以通過NHibernate來完成嗎?

更新 這裏是映射:

<class name="MyProj.News.Category, MyProj.News"> 
    <id name="Id" column="ID"/> 

    <bag name="Articles" table="Category_Article" lazy="true"> 
     <key column="CATEGORY_ID"/> 
     <many-to-many class="MyProj.News.Article, MyProj.News" column="Article_ID"/> 
    </bag> 
</class> 

<class name="MyProj.News.Article, MyProj.News"> 
    <id name="id" column="ID"/> 
    <!-- inverse end --> 
    <bag name="categories" table="Category_Article" inverse="true" lazy="true"> 
     <key column="ARTICLE_ID"/> 
     <many-to-many class="MyProj.News.Category, MyProj.News" column="CATEGORY_ID"/> 
    </bag> 
</class> 
+0

你可以發佈你的映射和/或表結構嗎?另外,當你說你想用'NHibernate'完成這個時,hql會被接受嗎? – DanP 2012-01-17 18:21:16

回答

1

是的,這是可能的,但有一些SQL魔術。我不會在這裏提供完整的解決方案,但希望你能弄清楚。

對於計數,最好將Count屬性添加到您的Category實體和map it using formula子查詢「select count(*) from Items ...」。

對於前5個項目,您需要修改您的Category.Items集合映射或創建另一個,即Category.TopItems。然後加入where mapping來篩選結果頂部5行(用於SQL Server,你可以使用類似「row_number() over(order by DateAdded) < 5」有等同於其它數據庫是肯定的,太

0

也許你可以考慮另一種方法;而不是試圖在一個查詢中創建您的整個結果 - 怎麼樣在一個往返發送多個查詢

NHibernate的具有在multi-queriesmulti-criteriafutures形式對此的支持,然後你可以組裝的這些較小的結果?查詢成適合顯示的形式。

我應該注意hql最近已經添加了support for skip and take結構,您可能會使用它構造每個類別查詢中的頂部(x)。

0

即使使用直接的SQL,也不容易以有效的方式完成。要以適當的方式解決這個問題,您應該緩存類別實體上文章的數量。任何時候你可以消除對數據庫不必要的查詢,你應該。

這樣做很簡單。添加新文章或刪除新文章時,觸發類別總數的更新。

該解決方案全部採用最佳方法,因爲現在文章的總數已存在於類別實體中。然後,您只需撥打一次電話即可獲取該類別的前n篇文章的列表。