这是一个简单的概念,但是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
的排序顺序将另外用于确定第一个。
答案 0 :(得分:4)
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();