【问题标题】:SUM and COUNT in single LINQ to SQL query单个 LINQ to SQL 查询中的 SUM 和 COUNT
【发布时间】: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


【解决方案1】:
This query can be rewritten in sql format as follows

var orderList = db.Orders.Where(o => o.Flag );
var orderSummary = from o in orderList
                   group o by 1 into p
                   select new
                   {
                      Items = p.Count(),
                      Total = p.Sum( x => x.CostInCents)
                   }

【讨论】:

    【解决方案2】:

    我认为您正在寻找的是以下轻微调整:

    var q = db.Orders
       .Where(o => o.Flag).Select(o => o.CostInCents).ToList(); // hit the db here once
    
    //No groupBy
    var result2 = new MyDTO
    {
        NoOfCostedOrders = q.Count(), // don't hit the db
        TotalInCents = q.Sum() // don't hit the db a 2nd time
    };
    

    如果您对我的调整有任何疑问,请随时发表评论。

    【讨论】:

    • 非常聪明...我投票 +1。然而,问题是,如果你有十万个或十万个,它会返回那么多糟糕的记录——非常糟糕。但是,伙计,您正在跳出框框思考。我喜欢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多