我有这个简单的表达式来获取每个订单的金额:
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
个子?
答案 0 :(得分:0)
您目前的结构方式是什么?不会。您将始终执行.Select()
语句,因为.Count()
立即执行(请参阅here for a list)。但是,.Count()
也有一个覆盖,它接受Func
,您应该可以使用它来获取计数,而不必先执行选择,如下所示:
context.Orders.GroupBy(a => new { orderNo = a.orderNo })
.Count(a => a.Key.orderNo != string.Empty);
编辑:哎呀,忘了这是一个布尔。编辑相应。
编辑2:根据评论,我认为这是不可能的,因为在任何特定时间你总是需要在那里进行选择,.Count()
将永远称之为。遗憾。