2012-01-17 98 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篇文章的列表。