Entity Framework - Запрос для получения двух последних уникальных записей столбца, а затем соответствующих данных - PullRequest
0 голосов
/ 24 сентября 2019

Я новичок в структуре сущностей, и у меня возникают трудности с запросом.Для следующей ситуации. Скажем, у меня есть следующая модель

class Student
{
 [Key]
 public int Id { get; set; }
 public string name{get;set;}
 public string guid{get;set;}
}

, и моя таблица выглядит следующим образом

   id|   name | guid
       --------------
   1  Andrew | C
   2  John   | D
   3  Adam   | B
   4  Charles| A
   5  Jacob  | A

Теперь я хотел бы получить два последних уникальных идентификатора GUID, которые будут A и B.и тогда я бы хотел получить всю строку, в которой эти GUIS появились в таблице.поэтому я хотел бы, чтобы Джейкоб, Чарльз и Адам вернулись.Любые предложения о том, как я могу начать с этим?Я знаю, что придется отсортировать, а затем выбрать уникальный.Но я не уверен, как я это сделаю в Entity.

Ответы [ 2 ]

2 голосов
/ 25 сентября 2019

Вам нужно использовать это только если вы хотите выводить как Jacob,Charles and Adam

Оригинальные кредиты @ Stackberg использовать предложенный запрос как без Take, если с отступомрезультат.

//This work against in memory list (TESTED)
var result = dbcontext.Students.OrderByDescending(s => s.Id)
                      .GroupBy(s => s.Guid)
                      .Take(2)
                      .SelectMany(s=>s.ToList());

//IF EF doesn't able to convert the query you can try this.

var inMemoryGrouped = dbcontext.Students.OrderByDescending(s => s.Id)
                      .GroupBy(s => s.Guid)
                      .Take(2)
                      .ToList();

//Flatten the items using select many 
var final = inMemoryGrouped.SelectMany(y=>y.ToList());

Единственное, чем он отличается от ответа @Stackberg, опускается Take после группировки.

2 голосов
/ 24 сентября 2019

Я думаю, вы могли бы сделать что-то вроде этого:

var result = dbcontext.Students.OrderByDescending(s => s.Id)
                      .GroupBy(s => s.Guid)
                      .Take(2)
                      .SelectMany(s => s.Take(1));

1 - Сортировать по Id по убыванию, чтобы перейти к последнему Id.

2 - Затем сгруппировать по Guid и взятьпервые 2 группы.

3 - Выберите верхнюю 1 для каждой группы.

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