NHibernate - 获取每个类别中的类别,计数和前5个项目

时间:2012-01-17 17:17:22

标签: nhibernate

在我的应用程序中,我有很多文章,每篇都属于一个或多个类别。在我的主页上,我想列出所有类别及其中包含的文章总数,我希望在其中显示前X篇文章描述(基于文章发布的时间)。它看起来像下面的

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>

3 个答案:

答案 0 :(得分: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”的内容。还有其他数据库的等效项。

答案 1 :(得分:0)

也许你可以考虑另一种方法;而不是尝试在一个查询中创建整个结果集 - 如何在一次往返中发送多个查询?

NHibernate以multi-queriesmulti-criteriafutures的形式支持此功能。然后,您可以将这些较小查询的结果组合成一个有意义的表单。

我应该注意到hql最近添加了support for skip and take个构造,你可以用它来构建每个类别查询中的top(x)。

答案 2 :(得分:0)

即使使用直接的SQL,也不能以有效的方式轻松完成。要以正确的方式解决此问题,您应该缓存类别实体上的文章计数。任何时候你都可以消除对数据库的不必要的查询,你应该。

这样做很简单。添加新文章或删除其中一篇文章时,会触发该类别总计数的更新。

此解决方案是最佳方法,因为现在类别实体上存在文章总数。然后,您只需拨打一个电话即可获得该类别的前n篇文章列表。