使用第一个/最早的日期返回多个记录

时间:2018-06-30 07:43:41

标签: c# sql sql-server entity-framework linq

这是一个简单的概念,但是LINQ / SQL解决方案让我感到困惑!

在下面的示例数据中,我需要为每个ID检索一个ISRC,并为每个ID取最早的日期。

数据按ID/ReleaseDate/ISRC排序,因此我可以读取每个ID的第一条/顶部记录。 即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。

我正在使用带有EF的ASP.NET Core 2.0,代码是C#,数据库是SQL Server 2016。

它在我使用dbcontext引用的表中,所以我从

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

我尝试使用MIN()作为日期,或对数据进行排序,然后使用.FirstOrDefault()Take(1),但只能设法取回一条记录。

我需要返回一组数据-每个ISRC最早的ID

如果同一日期碰巧有多个ISRC,则ISRCS的排序顺序将另外用于确定第一个。

2 个答案:

答案 0 :(得分:4)

您可以使用GroupByMin方法。像这样:

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
             };

答案 1 :(得分:1)

尝试以下操作:

var earliestISRCS = _context.allISRCS
    .OrderByDescending(x => x.ReleaseDate)
    .GroupBy(x => x.ID)
    .Select(x => x.First())
    .OrderBy(x => x.ID)
    .ToList();