2016-10-07 7 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)でもOKですか?

もう1つのオプションは、以下のように2つのクエリを実行することです。

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

大丈夫です。このトリックは、** by group by constant **と呼ばれ、単一のdbクエリで複数の集計を生成する唯一のLINQの方法です。 –

答えて

0

これはきれいこの方法です:結果が読めないと厄介なコードであれば

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

は1つのライナーに固執しないでください。 そして、あなたはw/cでグループを取り除くために追加のオーバーヘッドがあります。

+0

@MachineLearningありがとう、しかし、グループbyは彼のシナリオでは役に立たない。 – Sherlock

+3

定数によるグループの使用は正確に2(またはそれ以上の)クエリを発行するのではなく、1つのselectにdb要求を減らすことです... –

+0

@MachineLearningその引数はありません:)しかし、このアプローチではdb要求は一度だけ送られました。 'var q = db.Orders.Where(o => o.Flag)'。そして、結果の値に対して後続の演算が実行されます – Sherlock