C# Linq查询按日期对项目进行计数和分组

C# Linq查询按日期对项目进行计数和分组,c#,.net,linq,C#,.net,Linq,我有一组从EF提取的订单。每个订单都有一个订单日期: public class Order { public DateTime Date { get; set; } public int Id { get; set; } } 我希望能够运行查询以返回特定日期范围内每天的订单数量。查询方法应类似于: public class ICollection<OrderDateSummary> GetOrderTotalsForDateRange(DateTime startD

我有一组从EF提取的
订单
。每个
订单
都有一个订单日期:

public class Order {
    public DateTime Date { get; set; }
    public int Id { get; set; }
}
我希望能够运行查询以返回特定日期范围内每天的订单数量。查询方法应类似于:

public class ICollection<OrderDateSummary> GetOrderTotalsForDateRange(DateTime startDate, DateTime endDate) {

      var orderDateSummary = Set.SelectMany(u => u.Orders) // ..... grouping/totalling here?!

      return orderDateSummary;
}
Date          Total
===================
01/01/2016       10
02/01/2016        2
03/01/2016        0
04/01/2016       12
因此,2016年1月1日开始日期和2016年1月3日结束日期的输出如下所示:

public class ICollection<OrderDateSummary> GetOrderTotalsForDateRange(DateTime startDate, DateTime endDate) {

      var orderDateSummary = Set.SelectMany(u => u.Orders) // ..... grouping/totalling here?!

      return orderDateSummary;
}
Date          Total
===================
01/01/2016       10
02/01/2016        2
03/01/2016        0
04/01/2016       12
var startDate=新日期时间(2016,1,1);
var endDate=新的日期时间(2016,1,4);
设置。选择多个(u=>u订单)。
其中(订单=>startDate
新OrderDateSummary(){
日期=日期,
总计=值。计数()
}).
OrderBy(summary=>summary.Date)。
托利斯特();
只需使用
class
struct
标记您的
OrderDateSummary
,并将这些属性
public
或添加构造函数即可

您的预期结果是2016年1月4日,所以,我想您的结束时间是第4天,而不是第3天。

怎么样

List<OrderDateSummary> Result = OrderList       
    .Where(x => x.Date >= startDate && x.Date <= endDate)
    .GroupBy(x => x.Date)
    .Select(z => new OrderDateSummary(){
          Date = z.Key, 
          Total = z.Count()
     }).OrderBy(d=> d.Date).ToList();
List结果=订单列表
其中(x=>x.Date>=startDate&&x.Date x.Date)
.Select(z=>neworderdatesummary(){
日期=z键,
总计=z.计数()
}).OrderBy(d=>d.Date).ToList();

尝试下面是linq的代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace ConsoleApplication82
{
    class Program
    {
        static void Main(string[] args)
        {
            List<OrderDateSummary> orderSummary = null;

            DataTable dt = new DataTable();
            dt.Columns.Add("id", typeof(int));
            dt.Columns.Add("date", typeof(DateTime));
            dt.Columns.Add("amount", typeof(decimal));

            dt.Rows.Add(new object[] { 1, DateTime.Parse("1/1/16"), 1.00 });
            dt.Rows.Add(new object[] { 2, DateTime.Parse("1/1/16"), 2.00 });
            dt.Rows.Add(new object[] { 3, DateTime.Parse("1/2/16"), 3.00 });
            dt.Rows.Add(new object[] { 4, DateTime.Parse("1/2/16"), 4.00 });
            dt.Rows.Add(new object[] { 5, DateTime.Parse("1/2/16"), 5.00 });
            dt.Rows.Add(new object[] { 6, DateTime.Parse("1/3/16"), 6.00 });
            dt.Rows.Add(new object[] { 7, DateTime.Parse("1/3/16"), 7.00 });

            orderSummary = dt.AsEnumerable()
                .GroupBy(x => x.Field<DateTime>("date"))
                .Select(x => new OrderDateSummary() { Date = x.Key, Total = x.Count() })
                .ToList();
        }

    }
    public class OrderDateSummary {
      public DateTime Date { get; set; }
      public int Total { get; set; }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用系统数据;
命名空间控制台应用程序82
{
班级计划
{
静态void Main(字符串[]参数)
{
List orderSummary=null;
DataTable dt=新的DataTable();
添加(“id”,typeof(int));
添加(“日期”,类型(日期时间));
dt.列。添加(“金额”,类型(十进制));
Add(新对象[]{1,DateTime.Parse(“1/1/16”),1.00});
Add(新对象[]{2,DateTime.Parse(“1/1/16”),2.00});
Add(新对象[]{3,DateTime.Parse(“1/2/16”),3.00});
Add(新对象[]{4,DateTime.Parse(“1/2/16”),4.00});
Add(新对象[]{5,DateTime.Parse(“1/2/16”),5.00});
Add(新对象[]{6,DateTime.Parse(“1/3/16”),6.00});
Add(新对象[]{7,DateTime.Parse(“1/3/16”),7.00});
orderSummary=dt.AsEnumerable()
.GroupBy(x=>x.Field(“日期”))
.Select(x=>neworderdatesummary(){Date=x.Key,Total=x.Count()})
.ToList();
}
}
公共类OrderDateSummary{
公共日期时间日期{get;set;}
公共整数总计{get;set;}
}
}

正如我所见,您需要生成从
开始
结束
范围内的所有日期。然后计算每个日期的订单总数

DateTime start = new DateTime(2016, 1, 1);
DateTime end = new DateTime(2016, 1, 4);
Enumerable
    .Range(0, 1 + (end - start).Days)
    .Select(x => start.AddDays(x))
    .GroupJoin(Set.SelectMany(u => u.Orders),
        dt => dt, o => o.Date.Date,
        (dt, orders) => new OrderDateSummary { Date = dt, Total = orders.Count() })
    .ToList();

退房。

您有什么问题?无法看到问题或可能出现的任何错误。var x=orderDateSummary=Set.SelectMany(u=>u.Orders)。其中(x=>x.startdate>=sdate&&x.Enddatex.total)您是否还需要零行
03/01/2016-0
?您可以始终添加
ToList()
最后。这看起来是最好的解决方案,因为在没有订单的任何日子,它都应该加零。然而,当我使用这个查询时,它返回了所有天的总计数为零?@Graham,检查编辑。已更改
o=>o.Date
->
o=>o.Date.Date
。我以为你的订单日期没有时间,但如果你说你得到零,这可能是原因。