Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq-检索一段时间(7天)的数据,即图的订单计数_Linq_Entity Framework_Datetime_Kendo Dataviz - Fatal编程技术网

Linq-检索一段时间(7天)的数据,即图的订单计数

Linq-检索一段时间(7天)的数据,即图的订单计数,linq,entity-framework,datetime,kendo-dataviz,Linq,Entity Framework,Datetime,Kendo Dataviz,首先,我找到了解决问题的办法。问题是——有没有更好的办法 我需要检索一段时间(7天)的订单计数列表,例如使用GROUPBY。在某些日子里,没有订单,这意味着这些日子将从一组人中被淘汰 这就是我需要实现的目标(使用剑道UI条形图): 我分两个阶段来做。首先创建天数的枚举,然后从数据库检索订单计数 注: db是一个实体框架数据上下文。 DbFunctions.TruncateTime()仅用于比较日期,忽略时间部分) 能做得更好吗?要检索过去7天内的项目计数/总和?我认为这应该是可行的。我们的想法

首先,我找到了解决问题的办法。问题是——有没有更好的办法

我需要检索一段时间(7天)的订单计数列表,例如使用GROUPBY。在某些日子里,没有订单,这意味着这些日子将从一组人中被淘汰

这就是我需要实现的目标(使用剑道UI条形图):

我分两个阶段来做。首先创建天数的枚举,然后从数据库检索订单计数

注: db是一个实体框架数据上下文。 DbFunctions.TruncateTime()仅用于比较日期,忽略时间部分)


能做得更好吗?要检索过去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
                     });