我有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; }
}
答案 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)
假设:
您可以使用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()