Получайте только последние результаты, используя nHibernate - PullRequest
1 голос
/ 14 апреля 2009

У меня такой запрос nHibernate

ICriteria query = session.CreateCriteria(typeof(MyResult))
            .Add(Expression.Eq("ResultTypeId", myResult.ResultTypeId))

Проблема в том, что пользователи все время добавляют результаты, и я хочу показать таблицу всех последних результатов для всех различных типов результатов, которые у меня есть.

Класс MyResult имеет свойство ResultDate. У меня вопрос: что мне добавить к запросу, чтобы он возвращал только последний результат для данного типа результата. Нечего сказать, что результаты будут в указанном порядке в базе данных.

Спасибо

Mark

Ответы [ 4 ]

2 голосов
/ 14 апреля 2009

Вы можете упорядочить результат по ResultDate, используя метод AddOrder, как показано ниже:

ICriteria query = session.CreateCriteria(typeof(MyResult))
        .Add(Expression.Eq("ResultTypeId", myResult.ResultTypeId))
        .AddOrder(Order.Desc("ResultDate"))
        .List<MyResult>();

Если вы хотите ограничить количество возвращаемых экземпляров MyResult, вы можете использовать метод SetMaxResults, например, так:

ICriteria query = session.CreateCriteria(typeof(MyResult))
        .Add(Expression.Eq("ResultTypeId", myResult.ResultTypeId))
        .AddOrder(Order.Desc("ResultDate"))
        .SetMaxResults(20)
        .List<MyResult>();
1 голос
/ 14 апреля 2009

Если я хорошо понимаю вопрос, Марк хочет увидеть обзор всех последних результатов для каждого типа.

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

Я думаю, что самый простой способ добиться этого - создать дополнительный класс, который мы можем назвать MyResultOverview, например:

public class MyResultOverview
{
    public int ResultId {get; set;}
    public int ResultTypeId {get; set;}
    public DateTime ResultDate {get; set;}
}

Этот класс не должен отображаться, но NHibernate должен знать, что этот класс существует. Поэтому нам придется импортировать его:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" >
   <import class="MyResultOverview" />
</hibernate-mapping>

Затем мы можем создать ICriteria, который будет заполнять экземпляры MyResultOverview (и который также будет генерировать наиболее эффективный SQL-запрос для получения этого обзора). Это должно выглядеть примерно так:

ICriteria criteria = session.CreateCritera (typeof(MyResult));

criteria.SetProjection (Projections.ProjectionList ()
                           .Add (Projections.Property("Id"), "ResultId")
                           .Add (Projections.Property("ResultType"), "ResultType")
                           .Add (Projections.Max("ResultDate"), "ResultDate"));

criteria.SetResultTransformer (Transformers.AliasToBean (typeof(MyResultOverview)));

IList<MyResultOverview> results = criteria.List<MyResultOverview>();

Это должно дать вам список экземпляров MyResultOverview, которые представляют искомые результаты MyResults. Затем, чтобы получить сам MyResult, вы можете просто сделать это, извлекая экземпляр MyResult для того Particalur ResultId, который вы также получили.

Я не проверял и не компилировал его, но я бы пошел по этому пути, чтобы достичь этого.

1 голос
/ 14 апреля 2009

Порядок по ResultDate (по убыванию) и выберите сверху все, что вы считаете нужным.

0 голосов
/ 31 августа 2013

В HQL это может работать:

select item, tag
from MyItem item
    join item.Tags tag
where tag.Id = (                                    
    select  max(tag2.Id)  
    from MyItem item2
        join item2.Tags tag2
    where item2.Id = item.Id
    group by item2.Id     
)      
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...