2011-12-06 56 views
3

我有2個類如下。如果我有一個像列表一樣的類Schedule的通用列表,我將如何編寫一個LINQ查詢,以便我可以獲取此列表中SourceId與1,2,3 ... X和StartTime>某些日期時間相匹配的所有項目,然後我想要返回頂部3元每個的sourceID(即:通過的sourceID組)LINQ在條款與分組和TOP N記錄在每個組

由於名單將包含的記錄數量龐大,我想編寫最高效的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; } 
} 

回答

0

的形式假設:

  • 2個源具有相同源ID
  • 要通過開始時間
  • 下令這三個因素,你真行與具有List<KeyValuePair<int,Schedule>>爲你的結果(前3名的來源標識分組,仍返回作爲一個列表)

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

使用Google的小時後:

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

這對於優化我的Linq查詢非常有用。 :) –