2016-10-07 84 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