【问题标题】:Returning multiple records using first/earliest date使用第一个/最早日期返回多条记录
【发布时间】:2018-06-30 07:43:40
【问题描述】:

这是一个简单的概念,但 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#,db 是 SQL Server 2016。

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

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

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

我需要的是返回一组数据——最早的ISRC per ID

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

【问题讨论】:

  • ISRC 值是否唯一?从您发布的示例数据中很难判断。
  • 顺便说一句,您的ID 值不是唯一的..这背叛了“ID”(代表“身份”)的含义。
  • 分组,Min,问题已解决

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


【解决方案1】:

您可以使用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
             };

【讨论】:

  • 这个示例代码非常有用。我没有使用 'let' 子句,所以很高兴能学到一些对未来发展有用的新东西。我只需要添加另一个条件 ...FirstOrDefault(c => c.ReleaseDate == min && c.ID == grouped.Key) 以确保我正在获取相关曲目的数据。谢谢!
【解决方案2】:

尝试以下:

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

【讨论】:

  • 虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。
  • 感谢您提供替代代码。我只需要修改和使用 .OrderBy(x => x.ReleaseDate).ThenBy(x => x.ISRC) 来确保 x.First() 返回正确的数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 2021-11-30
  • 2023-03-22
  • 1970-01-01
相关资源
最近更新 更多