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

Это простая концепция, но решение LINQ / SQL поставило меня в тупик!

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

Данные отсортированы по ID/ReleaseDate/ISRC, поэтому я мог прочитать первую / верхнюю запись для каждого идентификатора. то есть ID 1 = GBMNA1600001 , ID 2 = GBMNA1600002 , ID 3 = GBMNA1600003 , ID 20 = GBMNA1680058 ...

ID  ProductID   ISRC    ReleaseDate
1   16  GBMNA1600001    2016-03-27 00:00:00.0000000
1   26  GBMNA1680038    2016-04-24 00:00:00.0000000
1   32  GBMNA1680057    2016-05-01 00:00:00.0000000
1   132 GBMNA1680482    2016-11-13 00:00:00.0000000
1   223 GBMNA1781107    2017-03-26 00:00:00.0000000
2   5   GBMNA1600002    2016-02-14 00:00:00.0000000
2   32  GBMNA1680049    2016-05-01 00:00:00.0000000
3   13  GBMNA1600003    2016-03-13 00:00:00.0000000
3   38  GBMNA1680095    2016-05-29 00:00:00.0000000
3   485 GBMNA1880099    2018-06-26 00:00:00.0000000
20  32  GBMNA1680058    2016-05-01 00:00:00.0000000
20  39  GBMNA1680084    2016-05-29 00:00:00.0000000
20  116 GBMNA1680399    2016-10-30 00:00:00.0000000
20  281 GBMNA1780886    2017-06-05 00:00:00.0000000
20  360 GBMNA1600028    2018-01-08 00:00:00.0000000

Но я не знаю, с чего начать с синтаксиса LINQ или даже выяснить, какой SQL он должен создать.

Я использую ASP.NET Core 2.0 с EF, код на C #, а db - это SQL Server 2016.

Это таблица, на которую я ссылаюсь, используя dbcontext, поэтому я начинаю с

var earliestISRCS = from i in _context.allISRCS
                    select i;

Я пытался использовать MIN() для даты или сортировать данные и использовать .FirstOrDefault() или Take(1), но мне удалось вернуть только одну запись.

Мне нужно вернуть набор данных - самое раннее ISRC за ID.

Если на одну и ту же дату окажется более одного ISRC, для определения первого будет дополнительно использоваться порядок сортировки ISRCS.

Ответы [ 2 ]

0 голосов
/ 30 июня 2018

попробуйте следующее:

var earliestISRCS = _context.allISRCS
    .OrderByDescending(x => x.ReleaseDate)
    .GroupBy(x => x.ID)
    .Select(x => x.First())
    .OrderBy(x => x.ID)
    .ToList();
0 голосов
/ 30 июня 2018

Вы можете использовать GroupBy и Min методы. Примерно так:

var result = from d in _context.allISRCS
             group d by d.ID into grouped
             let min = grouped.Min(d => d.ReleaseDate)
             select new {
                 ID = grouped.Key,
                 _context.allISRCS.FirstOrDefault(c => c.ReleaseDate == min)?.ISRC
             };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...