C# 使用第一个/最早的日期返回多个记录
这是一个简单的概念,但LINQ/SQL解决方案让我感到困惑 在下面的示例数据中,对于每个ID,我需要检索一个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
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
perID
如果同一日期恰好有多个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)来确保我获得了相关曲目的数据。谢谢