nhibernate группа по столбцу выбора на основе ограничений - PullRequest
2 голосов
/ 11 декабря 2011

У меня есть, кажется, довольно простая проблема, которую я сейчас не могу понять.

У меня есть такая таблица:

id | type | value | comment | date
1      1      22     test     dec 2nd
2      1      23     foo      dec 4th
3      2      2      bar      dec 1st

На основе модели

class MyClass
  public virtual long Id { get; set;}
  public virtual long Type { get; set;}
  public virtual long Value { get; set;}
  public virtual string comment { get; set;}
  public virtual DateTime Date { get; set;}

Мне нужно сгруппировать по типу и выбрать строку с самой последней датой.(То есть извлекать строки с ID 2 и ID 3).

Может ли кто-нибудь предоставить критерии с объяснением того, как это сделать?

1 Ответ

2 голосов
/ 12 декабря 2011

две поездки туда и обратно, 1 для получения типа / даты нужных строк и 1 для получения каждой строки.FutureValue<> объединит каждый запрос в цикле в одну поездку туда и обратно, а метод выбора преобразует значения FutureValues ​​в фактические значения.

class TypeDate
{
    public long Type { get; set; }
    public DateTime Date { get; set; }
}

var groups = session.CreateCriteria<MyClass>()
    .SetProjection(Projections.ProjectionList()
        .Add(Projections.GroupProperty("Type"), "Type")
        .Add(Projections.Max("Date"), "Date"))
    .SetResultTransForm(Transformers.AliasToBean<TypeDate>());
    .List<TypeDate>();

List<IFutureValue<MyClass>> futures = new List<IFutureValue<MyClass>>(groups.Count);
foreach (var group in groups)
{
    futures.Add(session.CreateCriteria<MyClass>()
        .Add(Restrictions.Eq("Type", group.Type))
        .Add(Restrictions.Eq("Date", group.Date))
        .FutureValue<MyClass>());
}

IEnumerable<MyClass> results = futures.Select(future => future.Value).ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...