Linq-检索一段时间(7天)的数据,即图的订单计数
首先,我找到了解决问题的办法。问题是——有没有更好的办法 我需要检索一段时间(7天)的订单计数列表,例如使用GROUPBY。在某些日子里,没有订单,这意味着这些日子将从一组人中被淘汰 这就是我需要实现的目标(使用剑道UI条形图): 我分两个阶段来做。首先创建天数的枚举,然后从数据库检索订单计数 注: db是一个实体框架数据上下文。 DbFunctions.TruncateTime()仅用于比较日期,忽略时间部分)Linq-检索一段时间(7天)的数据,即图的订单计数,linq,entity-framework,datetime,kendo-dataviz,Linq,Entity Framework,Datetime,Kendo Dataviz,首先,我找到了解决问题的办法。问题是——有没有更好的办法 我需要检索一段时间(7天)的订单计数列表,例如使用GROUPBY。在某些日子里,没有订单,这意味着这些日子将从一组人中被淘汰 这就是我需要实现的目标(使用剑道UI条形图): 我分两个阶段来做。首先创建天数的枚举,然后从数据库检索订单计数 注: db是一个实体框架数据上下文。 DbFunctions.TruncateTime()仅用于比较日期,忽略时间部分) 能做得更好吗?要检索过去7天内的项目计数/总和?我认为这应该是可行的。我们的想法
能做得更好吗?要检索过去7天内的项目计数/总和?我认为这应该是可行的。我们的想法是首先过滤范围内有
OrderDate
的所有订单,然后填充缺少的OrderDate,我们可以使用Concat
附加一些默认日期(范围内)。接下来,我们使用GroupBy
和OrderBy
来准备投影。最后,我们正常地对其进行投影,但请注意,g.Count()
应该减少1
,因为我们附加了所有默认日期(使每个日期的顺序增加1)
var data=db.Orders.Select(o=>DbFunctions.TruncateTime(o.OrderDate))
.Where(d=>DbFunctions.DiffDays(DbFunctions.TruncateTime(DateTime.Now),d)<7)
.Concat(可枚举的.Range(0,7).选择(i=>DateTime.Now.Date.AddDays(-i)作为DateTime?)
.GroupBy(d=>d)
.OrderBy(g=>g.Key)
.选择(g=>new{
Day=g.Key.ToSortDateString(),
订单=g.计数()-1
});
我认为这应该行得通。我们的想法是首先过滤范围内有OrderDate
的所有订单,然后填充缺少的OrderDate,我们可以使用Concat
附加一些默认日期(范围内)。接下来,我们使用GroupBy
和OrderBy
来准备投影。最后,我们正常地对其进行投影,但请注意,g.Count()
应该减少1
,因为我们附加了所有默认日期(使每个日期的顺序增加1)
var data=db.Orders.Select(o=>DbFunctions.TruncateTime(o.OrderDate))
.Where(d=>DbFunctions.DiffDays(DbFunctions.TruncateTime(DateTime.Now),d)<7)
.Concat(可枚举的.Range(0,7).选择(i=>DateTime.Now.Date.AddDays(-i)作为DateTime?)
.GroupBy(d=>d)
.OrderBy(g=>g.Key)
.选择(g=>new{
Day=g.Key.ToSortDateString(),
订单=g.计数()-1
});
此解决方案的一个主要问题是,您每次都要查询db.Orders,如果Order有数千条记录,那么这可能会很昂贵。
是的,有更好的方法:
var orderDictionary= (from ord in db.Orders
let dateOfOrder=DbFunctions.TruncateTime(ord.OrderDate)
where dateOfOrder>=fromDate && dateOfOrder<=toDate
group by dateOfOrder into ordGrp
select new {Key=ordGrp.Key,Count=ordGrp.Count()}).ToDictionary(o=>o.Key,o=>o.Count);
var data=days.Select(i=>new
{ Day=i.ToShortDateString(),
NoOfOrders=orderDictionary.ContainsKey(i.Date)?orderDictionary[i.Date]:null
});
var orderDictionary=(来自db.Orders中的ord
让dateOfOrder=DbFunctions.TruncateTime(order.OrderDate)
其中dateOfOrder>=fromDate&&dateOfOrdero.Key,o=>o.Count);
var数据=天数。选择(i=>新建
{Day=i.ToSortDateString(),
NoOfOrders=orderDictionary.ContainsKey(i.Date)?orderDictionary[i.Date]:空
});
此解决方案的一个主要问题是,您每次都要查询db.Orders,如果Order有数千条记录,那么这可能会很昂贵。
是的,有更好的方法:
var orderDictionary= (from ord in db.Orders
let dateOfOrder=DbFunctions.TruncateTime(ord.OrderDate)
where dateOfOrder>=fromDate && dateOfOrder<=toDate
group by dateOfOrder into ordGrp
select new {Key=ordGrp.Key,Count=ordGrp.Count()}).ToDictionary(o=>o.Key,o=>o.Count);
var data=days.Select(i=>new
{ Day=i.ToShortDateString(),
NoOfOrders=orderDictionary.ContainsKey(i.Date)?orderDictionary[i.Date]:null
});
var orderDictionary=(来自db.Orders中的ord
让dateOfOrder=DbFunctions.TruncateTime(order.OrderDate)
其中dateOfOrder>=fromDate&&dateOfOrdero.Key,o=>o.Count);
var数据=天数。选择(i=>新建
{Day=i.ToSortDateString(),
NoOfOrders=orderDictionary.ContainsKey(i.Date)?orderDictionary[i.Date]:空
});
这将不起作用,因为GroupBy具有删除日期,但没有订单。见图表中的2015年8月21日和2015年8月25日。@Nikita是的,我误读了这个问题。在那之后,我试着找到一个解决办法,最后得到了一个更新的答案。Enumerable有时间部分,所以目前我可能会得到两个记录,一个是2015年8月25日的记录,另一个是2015年8月25日15:50:00的记录。还有,为什么我们需要从计数中得到“-1”?@Nikita在Enumerable中,我使用了DateTime.Now.Date
而不仅仅是DateTime.Now
所以时间部分应该被删除。正如我所解释的,Concat
使每个日期的订单数增加1。因此,在最后我们必须减去1(那么丢失的日期将有订单计数=0)。这将不起作用,因为GroupBy具有无订单的删除日期。见图表中的2015年8月21日和2015年8月25日。@Nikita是的,我误读了这个问题。在那之后,我试着找到一个解决办法,最后得到了一个更新的答案。Enumerable有时间部分,所以目前我可能会得到两个记录,一个是2015年8月25日的记录,另一个是2015年8月25日15:50:00的记录。还有,为什么我们需要从计数中得到“-1”?@Nikita在Enumerable中,我使用了DateTime.Now.Date
而不仅仅是DateTime.Now
所以时间部分应该被删除。正如我所解释的,Concat
使每个日期的订单数增加1。因此,在最后我们必须减去1(那么丢失的日期将有订单计数=0)。
var orderDictionary= (from ord in db.Orders
let dateOfOrder=DbFunctions.TruncateTime(ord.OrderDate)
where dateOfOrder>=fromDate && dateOfOrder<=toDate
group by dateOfOrder into ordGrp
select new {Key=ordGrp.Key,Count=ordGrp.Count()}).ToDictionary(o=>o.Key,o=>o.Count);
var data=days.Select(i=>new
{ Day=i.ToShortDateString(),
NoOfOrders=orderDictionary.ContainsKey(i.Date)?orderDictionary[i.Date]:null
});