实体框架-获取的行计数(按子查询分组)

本文关键字:查询 框架 获取 实体 | 更新日期: 2023-09-27 18:30:00

我有一个简单的表达式来获取每个订单的金额:

public IQueryable<Orders> GetAccountSummery()
{
    return context.Orders.GroupBy(a => new { orderNo = a.orderNo })
   .Select(b => new 
   { 
   orderNo = b.Key.orderNo,
   amount = b.Sum(r => r.amount)
   });
}

我需要获取上一个表达式返回的记录总数:

SQL

select COUNT(1)  from 
(
 SELECT orderNo,SUM(amount) Amount  
FROM  Orders
group by orderNo
)tbl -- I get 125,000 row count here

EF

public int GetOrdersCount()
{
    return GetAccountSummery().Count(); // This guy here gives 198,000 rows which counts all rows from orders table
   // The following line gives the correct row count:
    return GetAccountSummery().AsEnumerable().Count(); // 125,000 row
}

GetAccountSummery().AsEnumerable().Count()的问题是它首先在服务器端运行查询,然后在客户端计算正确的行数(此处考虑表大小)

有没有什么方法可以在不执行select语句的情况下只获得正确的计数?

编辑

如果groupBy子查询不可能做到这一点,为什么Where子查询是这样?

实体框架-获取的行计数(按子查询分组)

您目前的结构方式是什么?不需要。您将始终执行.Select()语句,因为.Count()采用即时执行(请参阅此处查看列表)。然而,.Count()也有一个覆盖,它接收Func,您应该能够使用它来获取计数,而不必首先执行选择,如下所示:

context.Orders.GroupBy(a => new { orderNo = a.orderNo })
              .Count(a => a.Key.orderNo != string.Empty);

编辑:哎呀,忘了那是一个嘘声。相应地进行了编辑。

编辑2:根据评论,我认为这是不可能的,因为在任何给定的时间,你都需要在那里选择,而.Count()总是会调用它。对不起。