【问题标题】:GroupBy week/month按周/月分组
【发布时间】:2019-09-19 12:22:33
【问题描述】:

我正在从数据库中获取产品列表,每个产品都填充了 paymentDate,我想像这样格式化我的数据(只是一个例子):

{ 
  Week:1,
  Month:8,
  Total:50
},
{ 
  Week:2,
  Month:8,
  Total:40
},
{ 
   Week:3,
   Month:8,
   Total:70
},
{ 
   Week:4,
   Month:8,
   Total:85
 }
... and so on..

现在我将我的数据按月分组,并且在 4 个月内返回 4 INSTEAD OF 16 行,例如:

Month:8,
Total:250

这就是我不想要的..

这是我的代码:

首先,我从数据库中获取过去 4 个月的所有行,大约有 20-30 行具有 PaymentDate 值(这是过去 4 个月的行)。

var yas = await _context.products
                .AsNoTracking()
                .Where(x => (x.PaymentDate != null && x.PaymentDate > DateTime.UtcNow.AddMonths(-4))).ToListAsync();

在获得所有行后,我试图将它们分组,以便在每个月按 WEEKS 分组数据。

var grouped = yas.GroupBy(x => CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(x.PaymentDate ?? DateTime.UtcNow, CalendarWeekRule.FirstDay, DayOfWeek.Monday))
                    .Select(product => new ProductsDemoData
                    {
                        //Week = should be week
                        Amount = product.Sum(x => x.Amount),
                        Month = product.FirstOrDefault().PaymentDate.Value.Month
                    });

数据示例:

【问题讨论】:

  • 这应该会导致第 1 个月的第 1 周,而不是 8 周,因为这是一年中的一周。您是否想要每月​​的一周?
  • @juharr 在我的 yas 变量中有 3 个月的结果,所以应该有 9 周..
  • @Jon 你觉得朋友怎么样?
  • @Roxy'Pro:你怎么会期望得到 16 行?请提供一些示例数据。
  • @mm8 这个变量 yas 包含 20 种产品(1 月 5 日,2 月 5 日,3 月 5 日,4 月 5 日)......这 20 种产品中的每一种都有 ProductDate,我会喜欢像我上面发布的示例那样对这些行进行分组,我现在将对其进行一点扩展。 (基本上按月分组 - 每月按一周分组,我会得到第 3 周,第 3 周的项目总金额为 50 ..

标签: c# linq datetime group-by


【解决方案1】:

你已经按周分组了,所以我认为你可以这样做:

.Select(product => new ProductsDemoData
                {
                    Week = product.Key,
                    Amount = product.Sum(x => x.Amount),
                    Month = product.FirstOrDefault().PaymentDate.Value.Month
                });

【讨论】:

  • 那里的钥匙是什么?
  • @Roxy'Pro Key 是您分组的依据,在本例中为周数
  • 在您的Select 中,您正在对GroupBy 表达式的结果进行操作,即(IIRC)IGrouping。此类列表中的每个项目都有一个 Key 属性,这是分组依据。
  • @GPW 我认为它不起作用,因为我得到 4 行而不是 16 行,group by 不行。我应该得到 16 行 - 16 周 4 个月......跨度>
  • @Roxy'Pro groupBy 在 PaymentDate 的 weekNumber 上工作......如果 paymentDate 中只有 4 个不同的周可用,那么您将只获得 4 行。对于 16 周,付款日期必须跨越 16 周。数据中是否发生了这种情况?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-28
  • 1970-01-01
  • 1970-01-01
  • 2016-05-19
  • 1970-01-01
  • 1970-01-01
  • 2019-05-10
相关资源
最近更新 更多