在每个分组中取前N条记录的LINQ In子句与Group By

4
我有以下两个类。如果我有一个类Schedule的通用列表,如List,我该如何编写LINQ查询,以便在此列表中获取所有源ID匹配1,2,3...X并且开始时间大于某个日期时间的项目,然后我想针对每个SourceId返回前3个元素(即:按SourceId分组)。
由于此列表将包含大量记录,因此我希望编写最有效的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个回答

5

经过几个小时的谷歌搜索后:

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

这对优化我的Linq查询非常有用。 :) - Incredible

0

假设:

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

    IEnumerable<Schedule> schedules;
    DateTime someDateTime; // 用于比较的日期时间
    IEnumerable<int> sourceIds; // 必须匹配的源ID
    
    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()
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接