Выберите только самую последнюю запись для каждой группы записей - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть сущность БД, которая выглядит следующим образом:

public class History
{
    public int Id {get; set;}
    public string Text {get; set;}
    public DateTime DateTime {get; set;}
}

В дБ может быть несколько записей с одинаковым значением Text, и мне нужно выбрать только те из них, которые являются самыми последними (последними) для каждого отдельного «текста» - так для каждого из Text значение, которое я должен получить только одну последнюю запись.

Например, таблица базы данных с именем history:

id | text | dateTime
---------------------
 1   abc     2018-01-05
 2   qqq     2018-01-08
 3   abc     2018-01-01
 4   qqq     2018-05-05
 5   abc     2018-01-03

результат запроса должен быть таким:

1 abc 2018-01-05
4 qqq 2018-05-05

Прямо сейчас, используя nHibernate, я делаю так:

    var historyGroups = _session.Query<History>
        .OrderBy(x => x.DateTime)
        .GroupBy(x => x.Text)
        .ToArray();

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

Как добиться этого более эффективным способом, через LINQ to SQL или через чистый SQL?

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Я в конечном итоге использовал сырой SQL, как это:

var data = _session.CreateSQLQuery("select distinct on (text) * from public.history 
order by text, datetime desc;")
.AddEntity(typeof(History))
.List<History>();

возвращает последнюю запись для каждого отдельного значения Text.

0 голосов
/ 14 сентября 2018

Вы должны сгруппировать до заказа:

var historyGroups = _session.Query<History>
    .GroupBy(x => x.Text)
    .Select(x => new { text = x.Key, latest = x.First(y => y.DateTime == x.Select(z => z.DateTime).Max()) })
    .ToArray();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...