簡體   English   中英

使用Lambda或LINQ查詢按給定日期范圍按年和月分組

[英]Group by year and month with given date range using Lambda or 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

[請注意,2017年4月沒有庫存]如果我需要獲取2017年1月至2017年7月的報告計數。

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

GroupBy使用Lookup來獲取組

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

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

給定當前輸入

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM