2015-01-07 11 views
5

統計情報(ID int、col1 int、col2 int、col3 int ...) col1値、col2値、col3の合計を取得したい値など 単純なSQLクエリ:LINQクエリの複数の列の合計

SELECT SUM([Col1]), SUM([Col2]) 
FROM [dbo].[Statistics] 

が、LINQで:

var val1 = db.Statistics.Sum(x => x.Col1); 
var val2 = db.Statistics.Sum(x => x.Col2); 
var val3 = db.Statistics.Sum(x => x.Col3); 
... 

このようには動作しますが、これはデータベース上でN個のクエリを実行します。私は1つしか実行しません。私が見つけた唯一の方法はこれです:

var result = db.Statistics.GroupBy(x => 1).Select(x => new 
{ 
    val1 = x.Sum(k => k.Col1), 
    val2 = x.Sum(k => k.Col2), 
    val3 = x.Sum(k => k.Col3), 
}); 

複雑なクエリを生成すること。 それは正常ですか?

UPDATE これらは2つの実行計画です:

enter image description here

+2

パフォーマンスが十分であるかどうかはわかりません。あなたは私たちに言います。 **それを測定する**。それがあなたのために十分に機能するなら、それはあなたのために十分に機能します。そうでなければ、そうではないことが分かります。 – Servy

+0

可能[重複](http://stackoverflow.com/questions/2432281/get-sum-of-two-columns-in-one-linq-query) –

答えて

1

すべてはあなたのケースに依存します。あなたは絶対に正しい、それは最高のものではないクエリを生成したが、あなたはデータベースの違いを埋めるために十分な大きさですか?オプションとして、次のように書くと、ストアドプロシージャ、または生のクエリを呼び出すことができます。それはかなり単純なクエリを生成し、生成した実行計画がGroupBy

のないクエリの場合と同じである私のテストでは

var result = db.ExecuteQuery<Dto>("SELECT SUM([Col1]) AS Sum1, SUM([Col2]) AS Sum2 FROM [dbo].[Statistics]") 

public class Dto 
{ 
    public int Sum1{get;set;} 
    public int Sum2{get;set;} 
} 
+0

はい、私は可能ですが、これはlinqには制限があることを意味しますこの種類のクエリと私はこれについてはわからなかった – DevT

5

をLINQの:

var result = tblSystems.GroupBy (s => 1).Select (s => new 
{ 
    val1 = s.Sum (x => x.fkInfoSubCatID), 
    val2 = s.Sum (x => x.fkCompanyID), 
    val3 = s.Sum (x => x.eventResult) 
}); 

生成されたSQL:

-- Region Parameters 
DECLARE @p0 Int = 1 
-- EndRegion 
SELECT SUM([t1].[fkInfoSubCatID]) AS [val1], SUM([t1].[fkCompanyID]) AS [val2], SUM([t1].[eventResult]) AS [val3] 
FROM (
    SELECT @p0 AS [value], [t0].[fkInfoSubCatID], [t0].[fkCompanyID], [t0].[eventResult] 
    FROM [dbo].[tblSystem] AS [t0] 
    ) AS [t1] 
GROUP BY [t1].[value] 

実行計画: enter image description here

+0

それはSELECT SUM([Col1])、SUM([Col2])の同じ計画です FROM [dbo]。[統計]? – DevT

+0

データベースを使ってクエリをテストすることはできません。しかし、(同じような単純なクエリのために)同じ計画を生成するはずです。 – Magnus

+0

私はプランに最初の投稿を更新しました – DevT

関連する問題