NHibernate - Получить категории, количество и топ 5 элементов в каждой категории - PullRequest
1 голос
/ 17 января 2012

В моем приложении много статей, каждая из которых относится к одной или нескольким категориям. На моей домашней странице я хотел бы перечислить все категории с общим количеством статей, под которыми я хотел бы показать топ 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 ]

1 голос
/ 18 января 2012

Да, это возможно, но с некоторой магией SQL. Я не буду давать полное решение здесь, но, надеюсь, вы поймете это.

Для подсчета, лучше добавить новое свойство Count к вашей сущности Category и отобразить его, используя formula с подзапросом "select count(*) from Items ...".

Для топ-5 элементов вам нужно либо изменить сопоставление коллекции Category.Items, либо создать другое, т. Е. Category.TopItems. Затем добавьте where mapping , чтобы отфильтровать ваш результат в верхних 5 строках (для SQL Server вы можете использовать что-то вроде "row_number() over(order by DateAdded) < 5". Для других баз данных тоже есть эквиваленты.

0 голосов
/ 28 января 2012

Даже с прямым SQL это не легко сделать эффективным способом.Чтобы решить эту проблему надлежащим образом, вы должны кэшировать количество статей в объекте категории.Каждый раз, когда вы можете удалить ненужные запросы к базе данных, вам следует.

Сделать это достаточно просто.Когда новая статья добавляется или удаляется, инициируйте обновление для общего количества в категории.

Это лучшее решение, так как теперь общее количество статей существует для объекта категории.Затем вы можете просто сделать один звонок, чтобы получить список лучших n статей для категории.

0 голосов
/ 19 января 2012

Возможно, вы могли бы рассмотреть альтернативный подход; вместо того, чтобы пытаться создать весь набор результатов в одном запросе - как насчет отправки нескольких запросов в одном цикле?

NHibernate поддерживает это в виде мультизапросов , мультикритериев и фьючерсов . Затем вы можете собрать результаты этих небольших запросов в форму, которая имеет смысл для отображения.

Следует отметить, что в hql недавно была добавлена ​​поддержка для пропуска и добавления конструкций, которые вы, вероятно, могли бы использовать для построения вашего top (x) в каждом запросе категории.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...