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

时间:2014-11-11 20:38:51

标签: c# sql-server entity-framework linq-to-entities

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

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个子?

1 个答案:

答案 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()将永远称之为。遗憾。