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

时间:2013-06-12 13:58:19

标签: c# linq

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

  

ApplicantId,ProviderId,ApplicationDate

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

我想压制列表,以便列表中只包含每个ApplicantId / ProviderId的最早申请日期。

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

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

所有建议都表示赞赏。

2 个答案:

答案 0 :(得分:3)

回想一下GroupBy调用形成的每个群组都是IGrouping<ApplicationHistory>,实现IEnumerable<ApplicationHistory>。详细了解IGrouping here。您可以订购并选择第一个:

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

答案 1 :(得分:2)

您正在选择第一组。而是从每个组中选择第一项:

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();