![](/img/trans.png)
[英]How to group an SQL date column stored as int as Year Month using 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
有人可以指出我如何使用Lambda
或LINQ
查詢獲得以下結果。
更新:
這是我的代碼。
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.