2017-07-03 25 views
2

我有一個包含以下類型對象的列表。該列表當前按升序排列。使用Lambda或LINQ Query按給定日期範圍按年份和月份分組

public class ReportsCountByDate{ 
    public int CountOfReports { get ; set ;} 
    public DateTime ReportGeneratedDate { get ;set ;} 
} 

我的數據集:

CountOfReports  ReportGeneratedDate 
3     2017-02-07 
5     2017-02-21 
5     2017-03-12 
1     2017-05-03 
4     2017-05-23 
3     2017-06-12 

[請注意,沒有repot 2017年四月] 如果我需要從2017年一月到2017年七月得到報告數。

CountOfReports YearAndMonth 
0    2017-01 
8    2017-02 
5    2017-03 
0    2017-04 
5    2017-05 
3    2017-06 
0    2017-07 

有人能指出我如何使用LambdaLINQ查詢得到下面的結果。

更新:

這是我的代碼。

var startYear = input.durationStartDate.Year; 
var startMonth = input.durationStartDate.Month; 

var endYear = input.durationEndDate.Year; 
var endMonth = input.durationEndDate.Month; 

var yearRange = (endYear - startYear) == 0 ? 1 : (endYear - startYear); 

var monthRange = ((input.durationEndDate.Year - input.durationStartDate.Year) * 12 + input.durationEndDate.Month - input.durationStartDate.Month) == 0 ? 1 : ((input.durationEndDate.Year - input.durationStartDate.Year) * 12 + input.durationEndDate.Month - input.durationStartDate.Month); 



var desposition = await _dispositionSummaryManager.GetDispositionFormByCreateDate(input.platform, input.durationStartDate, input.durationEndDate); 

var changesPerYearAndMonth = 
        from year in Enumerable.Range(startYear, yearRange) 
        from month in Enumerable.Range(startMonth, monthRange) 
        let key = new { Year = year, Month = month } 
        join ReportsCountByDate in desposition on key 
          equals new 
          { 
           ReportsCountByDate.ReportGeneratedDate.Year, 
           ReportsCountByDate.ReportGeneratedDate.Month 
          } into g 
        select new { GroupCriteria = key, Count = g.Count() }; 
+0

你可以嘗試先 –

+1

建議**重構你的數據結構**簡化LINQ。在'我的數據集'中,添加'Year'和'Month'兩個屬性,並且所有輸入值也可以是年份和月份。 –

+0

@雷洋謝謝。有關如何設定日期範圍的建議? – NoughT

回答

0

鑑於當前輸入

var startDate = new DateTime(startYear, startMonth, 1); 
var endDate = new DateTime(endYear, endMonth + 1, 1).AddMinutes(-1); 

var months = new List<DateTime>(); 
var dt = startDate; 
while (dt < endDate) { 
    months.Add(dt); 
    dt = dt.AddMonths(1); 
} 

var result = from month in months 
      let key = new { month.Year, month.Month } 
      join report in desposition 
      on key equals new { report.ReportGeneratedDate.Year, report.ReportGeneratedDate.Month } into g 
      select new { 
       YearAndMonth = string.Format("{0}-{1:D2}", key.Year, key.Month), 
       CountOfReports = g.Sum(n => n.CountOfReports) 
      }; 
0

GroupBy使用Lookup to get the groups

var lookup = desposition.ToLookup(_ => _.ReportGeneratedDate.Year * 100 
    + _.ReportGeneratedDate.Month, _ => _.CountOfReports); 

var result = Enumerable.Range(201701, 12) 
      .Select(_ => new { CountOfReports = lookup[_].Sum(), YearAndMonth = _ }); 
+0

你是perl的傢伙用'_'嗎? –