实体框架-获取的行计数(按子查询分组)
本文关键字:查询 框架 获取 实体 | 更新日期: 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()
总是会调用它。对不起。