【问题标题】:Getting all orders that are from this month获取本月的所有订单
【发布时间】:2012-04-07 20:03:48
【问题描述】:

这是我当前的月份:

model.SalesForMonth = orders.Where(o => o.DateOfPayment.Value.Month == DateTime.Now.Month)
                            .Select(o => o.Total)
                            .Sum();

这没有按预期工作,因为它还在获取去年同月发生的订单。

当然我可以比较年月,但必须有一个我不熟悉的更具表现力的解决方案。

我怎样才能使用 Linq 干净地做到这一点? (不确定是否相关,但 orders 是来自实体框架的 IQueryable

【问题讨论】:

    标签: c# datetime iqueryable date-range


    【解决方案1】:

    最简单的方法是创建起点和终点:

    // TODO: Consider what time zone you want to consider the current date in
    var today = DateTime.Today;
    var start = new DateTime(today.Year, today.Month, 1);
    var end = start.AddMonths(1); // Exclusive end-point
    
    var query = orders.Where(o => o.DateOfPayment.Value >= start &&
                                  o.DateOfPayment.Value < end)
                            .Sum(o => o.Total)
    

    【讨论】:

      【解决方案2】:

      我不确定你想要什么。您也必须比较年份以确保订单来自今年。 我认为您可以使用 linq 做到这一点:

          model.SalesForMonth = orders.Where(o => (o.DateOfPayment.Value.Month == DateTime.Now.Month
       && o.DateOfPayment.Value.Year == DateTime.Now.Year))
                                      .Select(o => o.Total)
                                      .Sum();
      

      【讨论】:

      • 您的查询方法并不简单,因为它需要数据库中的日期处理函数,而不是简单的范围查询(例如 Jon 的回答)。此外,DateOfPayment 列上的简单索引不会与您的查询一起使用 - 保存该字段的月份和年份的两个表达式索引可以完成这项工作,尽管我确信这不是一个好方法.
      猜你喜欢
      • 2020-08-27
      • 1970-01-01
      • 2021-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-20
      • 1970-01-01
      相关资源
      最近更新 更多