LINQ In Clause with Group By和TOP N Records in Each Group

时间:2011-12-06 14:22:00

标签: c# .net linq group-by

我有2个课程如下。如果我有类似List的类列表的通用列表,我将如何编写LINQ查询,以便我可以获取此List中SourceId匹配1,2,3 ... X和StartTime>的所有项目。一些日期时间,然后我想返回每个SourceId的前3个元素(即:按SourceId分组)

由于此List将包含大量记录,因此我想编写最有效的LINQ查询

此外,我希望结果的最终形状为List

public class Source
{
    public int SourceId { get; set; }
    public string Name { get; set; }
}

public class Schedule
{
    public int SourceId { get; set; }
    public Source Source { get; set; }
    public DateTime StartTime { get; set; }
    public DateTime EndTime { get; set; }
}

2 个答案:

答案 0 :(得分:4)

经过数小时的谷歌搜索:

var result = r.ScheduleList.
             Where(s => sourceIdIntArray.Contains(s.SourceId) &&
                   s.StartTime >= new DateTime(2011, 09, 20)).
             GroupBy(s => s.SourceId).
             SelectMany(g => g.OrderBy(s => s.StartTime).
                             Take(3)).
             ToList();

答案 1 :(得分:0)

假设:

  • 没有2个来源具有相同的来源ID
  • 您想要按StartTime排序的前3个元素
  • 您可以使用List<KeyValuePair<int,Schedule>&gt;作为结果(前3个按来源ID分组,仍然作为列表返回)

    IEnumerable<Schedule> schedules;
    DateTime someDateTime; // date time used for comparison
    IEnumerable<int> sourceIds; // required matching source Ids
    
    schedules.OrderBy(x=>x.StartTime)
    .Where(x => x.StartTime > someDateTime)
    .GroupBy(x=>x.Source.SourceId)
    .Where(x=>sourceIds.Contains(x.Key))
    .ToDictionary(x=>x.Key, x=>x.Take(3))
    .ToList()