C# 实体框架-获取a的行数(按子查询分组)
我有一个简单的表达式来计算每个订单的金额:C# 实体框架-获取a的行数(按子查询分组),c#,sql-server,entity-framework,linq-to-entities,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) }); }
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)
});
}
环境足迹
GetAccountSummery.AsEnumerable.Count的问题是,它首先在服务器端运行查询,然后在客户端计算正确的行计数,考虑这里的表大小
有没有办法只获取正确的计数而不执行select语句 编辑如果groupBy子查询无法做到这一点,为什么它是针对Where子查询的?您当前的结构方式?不可以。您将始终执行.Selectstatement,因为.Count采用立即执行,请参阅。但是,.Count还有一个覆盖,它接受Func,您应该能够使用它来获取计数,而不必先执行select,因此:
context.Orders.GroupBy(a => new { orderNo = a.orderNo })
.Count(a => a.Key.orderNo != string.Empty);
编辑:哎呀,忘了那是一个笨蛋。据此编辑
编辑2:根据评论,我认为这是不可能的,因为你总是需要在任何给定的时间在那里选择,并且.Count将始终调用它。很抱歉。我在count func上收到此消息:无法隐式地将类型int转换为bool,这意味着count参数应该是boolsence orderNo是int我尝试了Counta=>a.Key.orderNo!=0我得到了同样不正确的结果198000..奇怪的是,执行了以下SQL:从SELECT COUNT1中选择[GroupBy1].[A1]作为[C1]从[dbo].[Orders]作为[Extent1],其中0[Extent1].[orderNo]作为[GroupBy1],但仍然没有按ORDERNOTH进行分组这很好。谢谢兄弟的帮助
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
}
context.Orders.GroupBy(a => new { orderNo = a.orderNo })
.Count(a => a.Key.orderNo != string.Empty);