C# 具有Group By的LINQ In子句和每组中的前N个记录
我有两门课,如下所示。如果我有一个类调度的通用列表,比如list,我如何编写LINQ查询,以便我可以获得这个列表中的所有项目,其中SourceId匹配1,2,3…X和StartTime>某个日期时间,然后我想返回每个SourceId的前3个元素(即:group by SourceId) 由于此列表将包含大量记录,因此我想编写最高效的LINQ查询 我还希望结果的最终形状是列表的形式C# 具有Group By的LINQ In子句和每组中的前N个记录,c#,.net,linq,group-by,C#,.net,Linq,Group By,我有两门课,如下所示。如果我有一个类调度的通用列表,比如list,我如何编写LINQ查询,以便我可以获得这个列表中的所有项目,其中SourceId匹配1,2,3…X和StartTime>某个日期时间,然后我想返回每个SourceId的前3个元素(即:group by SourceId) 由于此列表将包含大量记录,因此我想编写最高效的LINQ查询 我还希望结果的最终形状是列表的形式 public class Source { public int SourceId { get; set;
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; }
}
假设:
- 没有两个源具有相同的源Id
- 您需要按StartTime排序的前3个元素
- 您可以将
列表作为结果(前3名按源Id分组,仍然作为列表返回)
IEnumerable时间表; DateTime someDateTime;//用于比较的日期和时间 IEnumerable SourceId;//所需的匹配源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)) 托利斯先生()
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查询时非常有用。:)
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();