C# Linq查询按日期对项目进行计数和分组
我有一组从EF提取的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
订单
。每个订单
都有一个订单日期:
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
。我以为你的订单日期没有时间,但如果你说你得到零,这可能是原因。