在我的应用程序中,我有很多文章,每篇都属于一个或多个类别。在我的主页上,我想列出所有类别及其中包含的文章总数,我希望在其中显示前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>
答案 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-queries,multi-criteria和futures的形式支持此功能。然后,您可以将这些较小查询的结果组合成一个有意义的表单。
我应该注意到hql最近添加了support for skip and take个构造,你可以用它来构建每个类别查询中的top(x)。
答案 2 :(得分:0)
即使使用直接的SQL,也不能以有效的方式轻松完成。要以正确的方式解决此问题,您应该缓存类别实体上的文章计数。任何时候你都可以消除对数据库的不必要的查询,你应该。
这样做很简单。添加新文章或删除其中一篇文章时,会触发该类别总计数的更新。
此解决方案是最佳方法,因为现在类别实体上存在文章总数。然后,您只需拨打一个电话即可获得该类别的前n篇文章列表。