【问题标题】:How to calculate sum of amount for each 5 weeks before in linq?如何在linq中计算每5周前的金额总和?
【发布时间】:2014-08-26 15:16:50
【问题描述】:

我在数据库的收入表中有金额字段,以及同一张表中的创建日期。我需要这样的数据,

Week 1 => Sum(amount for week 1)
Week 2 => Sum(amount for week 2)
Week 3 => Sum(amount for week 3)
Week 4 => Sum(amount for week 4)
Week 5 => Sum(amount for week 5)

我的 linq 查询应该是什么。我正在使用实体框架。 已编辑: 说当前周的前 4 周 + 当前周 = 5 周。这里的本周是今天日期的一周。例如。今天是 2014 年 8 月 26 日,所以本周是从 2014 年 8 月 24 日(星期日) 2014 年 8 月 30 日 (星期六) .

【问题讨论】:

  • “第 1 周”到底是什么意思?每个月的前 7 天?还是从第一个星期一开始的前 7 天?或者是其他东西?如果有超过 5 周的数据怎么办?这个问题目前没有足够的信息来回答。
  • 我的意思是前 5 周,包括本周。
  • “当前周”是什么意思,确切地?这个问题仍然很不清楚。
  • @RedSwan:不一定。在某些国家/地区,一周从星期日开始,而不是星期一。当然,这可能不是大多数国家/地区的默认设置,但确定 OP 的确切含义或许仍然是件好事。
  • @Stakx,同意...考虑从周日到周六每周 7 天。

标签: c# linq entity-framework


【解决方案1】:

您可以使用EntityFunctions 中的方法来执行日期和时间运算。因此,您应该开始计算开始和结束日期,然后在必要时使用TruncateTime 将创建的日期截断为日期(而不是日期和时间),并使用DiffDays 工作出“自期间开始以来的天数”。然后除以 7 分组...

DateTime today = DateTime.Today;
DateTime start = today.AddDays(-(int) today.DayOfWeek) // Sunday...
                      .AddDays(-28);                   // 4 weeks ago
DateTime end = start.AddDays(7 * 5);

var result = from entry in db.Entries
             where entry.Created >= start && entry.Created < end
             group entry.Amount by EntityFunctions.DiffDays(start, 
                 EntityFunctions.TruncateTime(entry.Created)) / 7 into g
             select new { Week = g.Key + 1, Sum = g.Sum() };

虽然我预计会起作用,但我本人并没有亲自在 EF 中完成任何日期/时间工作。一般方法应该没问题,只是您可能需要对其进行调整。另请注意,这不会为您提供几周内没有任何条目的任何结果 - 在 EF 之外这样做可能最容易。

编辑:如果求和部分不起作用,则很容易在本地进行求和:

var query = from entry in db.Entries
             where entry.Created >= start && entry.Created < end
             group entry.Amount by EntityFunctions.DiffDays(start, 
                 EntityFunctions.TruncateTime(entry.Created)) / 7;

var result = query.AsEnumerable() // Execute the rest locally
                  .Select(g => new { Week = g.Key + 1, Sum = g.Sum() });

【讨论】:

  • 感谢您的帮助。其中 g.Sum() 不支持或解决。也许您对实体框架的看法是正确的。
  • @RedSwan:查看我的编辑...虽然还不清楚到底出了什么问题。 (如果您能给出 exact 错误消息,这将有所帮助。)
  • 错误 1 ​​'System.Linq.IGrouping' 不包含 'Sum' 的定义和最佳扩展方法重载 'System.Linq.ParallelEnumerable.Sum(System.Linq .ParallelQuery)' 有一些无效参数
  • 错误 2:实例参数:无法从 'System.Linq.IGrouping' 转换为 'System.Linq.ParallelQuery'
  • @Neel,我想说上帝会帮助那些努力的人 :) 不是吗...感谢上帝(@JonSkeet)...我正在向直接的上帝学习,这对我来说很宝贵:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-02
  • 2023-04-07
  • 2021-07-30
  • 1970-01-01
  • 1970-01-01
  • 2022-06-15
  • 1970-01-01
相关资源
最近更新 更多