【发布时间】:2017-02-16 02:39:37
【问题描述】:
我正在尝试在 LINQ-TO-SQL 中创建以下查询。
select count(*), sum( o.CostInCents ) from Orders o
where Flag = true;
我想出了以下 LINQ 查询:
var q = db.Orders
.Where(o => o.Flag )
var result = q
.GroupBy(o => 1)
.Select(g => new MyDTO
{
NoOfOrders = g.Count(),
TotalInCents = g.Sum(o => o.CostInCents )
})
.SingleOrDefaultAsync();
有没有更好的方法?
.GroupBy(o => 1) 还可以吗?
另一种选择是执行两个查询,如下所示。
var q = db.Orders
.Where(o => o.Flag );
//No groupBy
var result2 = new MyDTO
{
NoOfCostedOrders = q.Count(),//hit the db
TotalInCents = q.Sum(o => o.CostInCents )//hit the db 2nd time
};
我应该如何判断哪种方法更好?
提前致谢!
【问题讨论】:
-
在性能方面,我建议保持 iqueryable 只要您仍然可以过滤,stackoverflow.com/a/1578977/3956100 除了我不完全确定您想用代码完成什么。
-
你对Orders的分组要求是什么,不是很清楚,要使用哪个属性
-
没关系。该技巧称为按常量分组,并且是使用单个数据库查询生成多个聚合的唯一 LINQ 方法。
-
@IvanStoev 谢谢 :)
-
@IvanStoev 刚刚审核过,stackoverflow.com/questions/1597181/…,看起来只是将所有数据分组为一个单元,这样做有什么好处,没有它我们不能轻易得到结果。跨度>
标签: c# linq linq-to-sql