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

C# 使用第一个/最早的日期返回多个记录,c#,sql,sql-server,entity-framework,linq,C#,Sql,Sql Server,Entity Framework,Linq,这是一个简单的概念,但LINQ/SQL解决方案让我感到困惑 在下面的示例数据中,对于每个ID,我需要检索一个ISRC,并为每个ID取最早的日期 数据按ID/ReleaseDate/ISRC,以便我可以读取每个ID的第一条/顶部记录。 ie ID 1=GBMNA1600001,ID 2=GBMNA1600002,ID 3=GBMNA1600003,ID 20=GBMNA1680058 ID ProductID ISRC ReleaseDate 1 16 GBMNA1600001

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

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

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

如果同一日期恰好有多个
ISRC
,则将另外使用
ISRC
的排序顺序来确定第一个。

您可以使用和方法。大概是这样的:

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
             };
您可以使用和方法。大概是这样的:

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
             };
请尝试以下操作:

var earliestISRCS = _context.allISRCS
    .OrderByDescending(x => x.ReleaseDate)
    .GroupBy(x => x.ID)
    .Select(x => x.First())
    .OrderBy(x => x.ID)
    .ToList();
请尝试以下操作:

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

ISRC值是否唯一?从您发布的示例数据很难判断。顺便说一句,您的
ID
值不是唯一的。。这违背了“ID”(代表“身份”)的含义。Group by,Min,problem solved ISRC值是否唯一?从您发布的示例数据很难判断。顺便说一句,您的
ID
值不是唯一的。。这违背了“ID”(代表“身份”)的含义。分组方式,Min,问题解决当此代码可以回答问题时,提供有关此代码为什么和/或如何回答问题的其他上下文,以提高其长期价值。感谢您提供替代代码。我只需要修改并使用.OrderBy(x=>x.ReleaseDate).ThenBy(x=>x.ISRC)来确保x.First()返回了正确的数据。虽然这段代码可能会回答这个问题,但提供有关这段代码为什么和/或如何回答这个问题的附加上下文可以提高它的长期价值。感谢您提供替代代码。我只需要修改并使用.OrderBy(x=>x.ReleaseDate).ThenBy(x=>x.ISRC)来确保x.First()返回正确的数据。下面的示例代码非常有用。我没有使用“let”条款,所以学习一些对未来发展有用的新东西是很好的。我只需要添加另一个条件…FirstOrDefault(c=>c.ReleaseDate==min&&c.ID==grouped.Key)来确保我获得了相关曲目的数据。谢谢下面的示例代码非常有用。我没有使用“let”条款,所以学习一些对未来发展有用的新东西是很好的。我只需要添加另一个条件…FirstOrDefault(c=>c.ReleaseDate==min&&c.ID==grouped.Key)来确保我获得了相关曲目的数据。谢谢