【问题标题】:How can I get empty months while grouping records by last 12 month in EF Core 5如何在 EF Core 5 中按过去 12 个月对记录进行分组时获得空月份
【发布时间】:2022-01-05 08:36:47
【问题描述】:

我在下面有代码 sn-p 用于对过去 12 个月的记录进行分组,它可以正常工作,但我只是注意到不包括空月份。我哪里做错了? 提前致谢

public IQueryable<DashboardGrouping> DashboardStats()
{
   var yearAgo = DateTime.Now.AddYears(-1);
   var date = new DateTime(yearAgo.Year, yearAgo.Month, 1);

   var items = context.Set<Transaction>()
   .Where(x => x.IsActive &&
      x.CreatedAt.HasValue && x.CreatedAt.Value.Date >= date.Date && x.PaymentStatusId == 
      PaymentStatus.Completed)
   .Include(x => x.Payment)
   .Include(x => x.Branch)
   .AsNoTracking()
   .Select(x => new
   {
      Year = x.CreatedAt.Value.Year,
      Month = x.CreatedAt.Value.Month,
      CashAmount = x.Payment.CashAmount,
      CardAmount = x.Payment.CardAmount,
   })
   .GroupBy(x => new
   {
      Year = x.Year,
      Month = x.Month,
   })
   .Select(x => new DashboardGrouping
   {
      Year = x.Key.Year,
      Month = x.Key.Month,
      TotalSale = x.Sum(s => s.CashAmount + s.CardAmount)
   });
   return items; 
}

【问题讨论】:

  • 它需要客户端后处理。另一方面,如果您有所有月份的表,我们可以创建这样的查询。此外,您可以删除IncludesAsNoTracking,在GroupBySelect 之后都将被忽略。
  • 嗨@SvyatoslavDanyliv 我不确定你所说的整个月份的表是什么意思,但我很想知道如果我从 2021 年 5 月 1 日到今天手动生成整个月份,我该如何处理它2022 年 5 月 1 日。

标签: entity-framework entity-framework-core entity-framework-5


【解决方案1】:

您可以在缺少记录的情况下进行客户端后处理并丰富结果。

生成月份的辅助函数:

static IEnumerable<DateTime> GetMonths(DateTime startDate, DateTime endDate)
{
    startDate = new DateTime(startDate.Year, startDate.Month, 1);
    endDate = new DateTime(endDate.Year, endDate.Month, 1);

    while (startDate < endDate)
    {
        yield return startDate;
        startDate = startDate.AddMonths(1);
    }
}

后处理:

var currentDate = DateTime.Now;
var yearAgo = currentDate.AddYears(-1);

var months = GetMonths(yearAgo, currentDate);

var stats = DashboardStats().ToList();

// left join months to actual data
var query =
    from m in months
    join s in stats on new { m.Year, m.Month } equals new { s.Year, s.Month } into gj
    from s in gj.DefaultIfEmpty()
    select s ?? new DashboardGrouping
    {
        Year = m.Year,
        Month = m.Month,
        TotalSale = 0
    };

var result = query.ToList();

【讨论】:

  • 感谢您的回答。真的很有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-20
  • 2014-12-26
  • 1970-01-01
相关资源
最近更新 更多