使用Linq返回每个类别的第一个结果

本文关键字:第一个 结果 Linq 返回 使用 | 更新日期: 2023-09-27 18:17:58

我有一个类(ApplicationHistory)有3个属性:

ApplicantId, ProviderId, ApplicationDate

我将数据从数据库返回到一个列表中,但是其中包含重复的ApplicantId/ProviderId键。

我想抑制列表,以便列表只包含每个ApplicantId/ProviderId的最早的Application Date。

下面的例子是我目前所处的位置,但我不确定如何确保返回最早的日期。

    var supressed = history
        .GroupBy(x => new
        {
            ApplicantId = x.ApplicantId,
            ProviderId = x.ProviderId
        })
        .First();

感谢所有建议

使用Linq返回每个类别的第一个结果

回想一下,GroupBy调用形成的每个组都是一个IGrouping<ApplicationHistory>,它实现了IEnumerable<ApplicationHistory>。在这里阅读更多关于IGrouping的信息。您可以订购这些,然后选择第一个:

var oldestPerGroup = history
    .GroupBy(x => new
    {
        ApplicantId = x.ApplicantId,
        ProviderId = x.ProviderId
    })
    .Select(g => g.OrderBy(x => x.ApplicationDate).FirstOrDefault()); 

您正在选择第一组。相反,从每组中选择第一项:

var supressed = history
    .GroupBy(x => new {
        ApplicantId = x.ApplicantId,
        ProviderId = x.ProviderId
    })
    .Select(g => g.OrderBy(x => x.ApplicationDate).First());

或者查询语法(顺便说一下,在这种情况下,您不需要指定匿名对象属性的名称):

var supressed = from h in history
                group h by new {
                  h.ApplicantId,
                  h.ProviderId
                } into g
                select g.OrderBy(x => x.ApplicationDate).First();