【问题标题】:ALternative of Common Table Expression for Entity Framework [closed]实体框架的公用表表达式的替代方案[关闭]
【发布时间】:2018-05-31 07:03:00
【问题描述】:

我有以下表结构。

ID        Date        OrderNo   Status
1       2018-01-01    123       Open
1       2018-01-01    124       Open
1       2018-01-01    125       Open
1       2018-01-01    126       Open
1       2018-01-01    127       Closed
1       2018-01-03    128       Open
1       2018-01-03    129       Open
1       2018-01-03    130       Open
1       2018-01-04    131       Open
1       2018-01-04    132       Open
1       2018-01-04    133       Closed
1       2018-01-05    134       Open

我想准备一份报告,其中应显示状态“已关闭”(状态未关闭)的特定日期的订单计数

它还应该在表格中显示从最小日期到最大日期。

此表将包含近 2-3 年的数据。所以性能是 加载报告的关键因素。和某处平均 50k-60k 的行数。

所以报告应该如下

Date           Count
2018-01-01     4
2018-01-02     0
2018-01-03     7  ( 4 open orders of 1st + 0 open orders of 2nd + 3 open orders of 3rd)
2018-01-04     9  ( 1st date 4 + 0 2nd + 3 3rd + 2 4th date)

我想使用 Entity Framework 来生成它。

提前致谢。

【问题讨论】:

  • 到目前为止有什么尝试吗?
  • 由于 CTE 是内存中的表对象而不是临时表,因此您希望在 .Net 中创建一个匿名对象
  • 我可以很容易地使用 EF 编写错误的代码来产生结果,但不知道递归查询在 ef 中是如何工作的,这就是为什么在这里发布。因为这可能会持续一整年或超过 2-3 年的范围。所以性能是关键。
  • 顺便说一句,你是怎么得到这张桌子的?不是来自 SQL 数据库?
  • 这个问题不是微不足道的,所以我不明白为什么它被否决了。首先,OP 需要一个运行总数,第二个 - 固定键范围。 IMO 没有有效的方法可以通过 LINQ to Entities 查询来实现这一目标。

标签: c# .net sql-server entity-framework entity-framework-6


【解决方案1】:

尝试类似...

var results = DataContext.Orders.Where(o => o.Status != 'Closed').GroupBy(o => o.Date);

foreach(var r in results){
    var count = r.Count(); // number of closed record for a date
    var date = r.Key; // date
}

这对你有用吗?

更新: 您可能可以像下面这样使用 AsNoTracking。

var results = DataContext.Orders.AsNoTracking().Where(o => o.Status != 'Closed').GroupBy(o => o.Date);

根据https://msdn.microsoft.com/en-au/data/jj556203,当您需要查询大量记录以进行只读操作时,使用此功能可以提高性能。而且我猜对于您的要求,只读操作就足够了。

【讨论】:

  • 并确保日期列中不包含时间组件,否则上面将按每个日期时间条目对记录进行分组。
猜你喜欢
  • 2010-12-22
  • 1970-01-01
  • 2019-05-30
  • 2011-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-13
相关资源
最近更新 更多