Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有Group By的LINQ In子句和每组中的前N个记录_C#_.net_Linq_Group By - Fatal编程技术网

C# 具有Group By的LINQ In子句和每组中的前N个记录

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;

我有两门课,如下所示。如果我有一个类调度的通用列表,比如list,我如何编写LINQ查询,以便我可以获得这个列表中的所有项目,其中SourceId匹配1,2,3…X和StartTime>某个日期时间,然后我想返回每个SourceId的前3个元素(即:group by SourceId)

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

我还希望结果的最终形状是列表的形式

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