Выберите все отдельные последние записи столбца 1 и упорядочите по столбцу 2 в Linq (не работает соответственно) - PullRequest
3 голосов
/ 04 августа 2020

Итак, у меня есть такая таблица:

enter image description here

Now I want distinct ShortCode order by the ID descending. In other words, the distinct last records. Like this:

enter image description here

So I tried GroupBy like:

var data = db.ShortCodes.GroupBy(x => x.ShortCode).Select(x => x.FirstOrDefault()).OrderByDescending(s=> s.ID);

This gave me distinct records but not the last ones, nor ordered by ID descending:

enter image description here

Now I also tried like suggested здесь

var data = db.ShortCodeManager
               .GroupBy(s => s. ShortCode)
               .Select(g => g.First())
               .OrderByDescending(s => s.ID);

Это дало мне ошибку The method 'First' can only be used as a final query operation. Consider using the method 'FirstOrDefault' in this instance instead.

Итак, я изменился на FirstOrDefault(), например:

var data = db.ShortCodeManager
               .GroupBy(s => s. ShortCode)
               .Select(g => g.FirstOrDefault())
               .OrderByDescending(s => s.ID);

Это также дало мне отдельные записи, но не последние записи:

enter image description here

So finally I tried like suggested здесь :

var data = db.ShortCodeManager.Where(a => a.ID > 0).GroupBy(x => x.ShortCode).OrderByDescending(grp => grp.Max(g => g.ID)).Select(a => a.FirstOrDefault());

Опять же, это дало мне отдельные записи, но не последние, и не упорядоченные по убыванию идентификатора:

введите описание изображения здесь

Итак, как мне написать запрос, чтобы получить желаемый результат в Linq? Также обратите внимание, мне нужно больше отдельных последних записей, чем упорядочивание по ID по убыванию. Если кто-то также знает, как написать это в raw SQL, это тоже может быть полезно.

1 Ответ

3 голосов
/ 04 августа 2020

Этот запрос LINQ должен работать для вашего случая:

var result = db.ShortCodeManager
    .GroupBy(x => x.ShortCode)
    .Select(gr => new { Id = gr.Max(g => g.Id), ShortCode = gr.Key})
    .ToList();

EDIT:

На основе вашего комментария похоже, что вам нужно создать анонимный объект result в ShortCodeManagerModel введите, а затем передайте его вашему представлению. Итак, что-то вроде этого:

var result = db.ShortCodeManager
    .GroupBy(x => x.ShortCode)
    .Select(gr => new { Id = gr.Max(g => g.Id), ShortCode = gr.Key})
    .ToList();

var model = result 
    .Select(x => new ShortCodeManagerModel { Id = x.Id, ShortCode = x.ShortCode })
    .ToList();

А затем передайте model вашему просмотру.

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