2016-10-07 51 views
1

我正尝试在LINQ-TO-SQL中创建以下查询。单个LINQ to SQL查询中的SUM和COUNT

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 
}; 

我该如何判断哪种方法更好?

在此先感谢!

+0

在性能方面,我建议保持iqueryable,只要你仍然可以过滤,http://stackoverflow.com/a/1578977/3956100以外即时通讯不完全确定你想用代码完成什么。 – Niklas

+0

你对订单的分组要求是什么,不是很清楚,你想使用哪个属性 –

+4

没关系。这个技巧被称为** group by constant **,并且是使用单个数据库查询生成多个聚合的唯一LINQ方式。 –

回答

0

这是清洁的这样:

var sum = q.Sum(x => x.CostInCents); 
var count = q.Count(); 

不要坚持一个班轮如果结果是不可读和乱码。 而你摆脱组/ W是一个额外的开销

+0

@MachineLearning谢谢,但这个小组在他的情况下没用。 – Sherlock

+3

通过常量组的使用正是为了减少数据库请求1选择,而不是发出2(或更多)的查询... –

+0

@MachineLearning没有参数,但:)在这种方法中,数据库请求只发送一次。 'var q = db.Orders.Where(o => o.Flag)'。并且对后续操作执行的结果为 – Sherlock