2011-01-20 12 views
1

そこにあるTSQLの専門家またはLINQ C#の専門家に質問があります。私はいくつかのテーブルに参加するストアドプロシージャを持っています。基本的に名前、ID、およそ10の製品列ストアドプロシージャは、多くのデータ(時には90,000行以上)を返すことができます。ストアドプロシージャでは、結果をフィルタリングして、その行のすべての製品が存在するすべての行をフィルタリングします。私が行う必要があるのは、列(製品)のすべての値がゼロであるC#の列を削除することです。これは、私のアプリケーション内のいくつかのビジネスルール(顧客要求)に起因します。SQLまたはC#の列を合計

アプリケーションは、列名の配列をレポートビルダーに送信することによって、列を削除(非表示)できます。例:

|名前| ID | Prod1 | Prod2 | Prod3 | Prod4 |

私はレポートからPROD3とProd4を削除したい場合は、次の

List<string> hideColumns = new List<string>(); 
hideColumns.Add("Prod3"); 
hideColumns.Add("Prod4"); 

と私はビルダーおよびそれらの列が除去されるレポートに hideColumns.ToArray() を送信します。

私のアプリケーションでは、すべてのデータを送信し、次のLINQを使用して、返されたデータの列の値を検索します。

var zeroCols = from result in data 
       group result by new { } into C 
       select new ProductDataClass 
       { 
        Prod1 = C.Sum(x => x.Prod1) 
        Prod2 = C.Sum(x => x.Prod2) 
        ...etc to Prod10 
       }; 
if (zeroCols.Count() > 0) 
{ 
    if (zeroCols.First().Prod1 == 0) 
     hideColumns.Add("Prod1"); 
    ...etc to Prod10 
} 

である見つけるためにしかし、私の問題は、報告書は、多数の行を返す場合LINQは本当に遅いことです。誰でも提案をすることはできますか?

+0

新しい{}によるグループ結果は何をしますか?それは私にとって新しいものです。 –

答えて

5

これを2つのクエリに分割する方が高速です.1つはデータを返し、もう1つは集計クエリで1つの行を返すことです。集約クエリからの戻り値を使用して、どの列が0であり、非表示にする必要があるかを判断できます。

+0

ありがとう、これは可能性があった、私はちょうど専門家が何を言わなければならないか分からなかった。私はあなたの素早い応答に感謝します – Tom

+1

+1:私は同じに答えるつもりでしたが、あなたは私よりも速かったです。 – rsenna

+0

とにかくデータを取得している間、SQL Serverはそれを集計できません。ぼんやりとした何かを忘れていない限り、そのような方法があります... –