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

NHibernate-获取类别、计数和每个类别中的前5项,nhibernate,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 我的映射非常简单,可以从文章或类别中遍历,两者都有nhiberna

在我的应用程序中,我有许多文章,每一篇都属于一个或多个类别。在我的主页上,我想列出所有类别的文章总数,下面我想显示前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>

是的,这是可能的,但需要一些SQL魔法。我不会给出一个完整的解决方案,但希望你能解决这个问题

对于计数,最好将新的
count
属性添加到
Category
实体中,并使用子查询“
select count(*)from Items…


对于前5项,您需要修改Category.items集合映射或创建另一个集合映射,即Category.TopItems。然后添加以将结果过滤到前5行(对于SQL Server,您可以使用类似“
row_number()over(order by DateAdded)<5
”。当然,其他数据库也有相应的方法。

是的,这是可能的,但需要一些SQL魔法。我不会在这里给出完整的解决方案,但希望您能解决这个问题

对于计数,最好将新的
count
属性添加到
Category
实体中,并使用子查询“
select count(*)from Items…


对于前5个项目,您需要修改Category.items集合映射或创建另一个集合映射,即Category.TopItems。然后添加以将结果筛选到前5行(对于SQL Server,您可以使用类似“
行数()over(order by DateAdded)<5
”的内容也有其他数据库的等价物。

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

NHibernate以和的形式对此提供支持。然后,您可以将这些较小查询的结果组合成一个便于显示的表单


<> P> >我注意到HQL最近添加了一些构造,您可以使用它来构造每个类别查询中的Toph(x)。

< P>也许您可以考虑另一种方法,而不是试图在一个查询中创建整个结果集——如何在一次往返中发送多个查询?

NHibernate以和的形式对此提供支持。然后,您可以将这些较小查询的结果组合成一个便于显示的表单


我应该注意到hql最近添加了一些构造,您可以使用它们来构造top(x)在每个类别查询中。

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

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


此解决方案是最好的方法,因为现在类别实体上存在文章总数。您只需调用一次即可获得该类别前n篇文章的列表。

即使使用直接SQL,也不容易以高效的方式完成。要以正确的方式解决此问题,您应该使用缓存类别实体上的文章数。任何时候,如果您可以消除对数据库的不必要查询,则应该

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


此解决方案是最好的解决方案,因为现在类别实体上存在文章总数。然后,您只需调用一次即可获得该类别前n篇文章的列表。

您可以发布您的映射和/或表结构吗?此外,当您说要用“NHibernate”完成此任务时,hql是否可以接受你能发布你的映射和/或表结构吗?另外,当你说你想用“NHibernate”来完成这项工作时,hql可以接受吗?