1

レポートのソースとして使用しているデータベーステーブルがあります。テーブルのレイアウトは次のようになります。表1は、より大きなデータベース表のサブセットです。ただし、レポートには特定の列のみが必要なので、以下の関数を使用して新しいデータテーブルを作成しています。

Value  Description   Hours
    1          A           2
    2          B           3
    3          C           5
    1          A           3
    2          B           4
    2          B           3
    3          C           3


private DataTable CreateFocusOfEffortData()
    {
        var dtChartData = new DataTable();
        dtChartData.Columns.Add("Description", typeof(string));
        dtChartData.Columns.Add("Hours", typeof(Double));
        var myDataView = ReportData.DefaultView;
        myDataView.RowFilter = "ActivityUnitID = " + _ActivityUnitID;
        for (var i = 0; i < myDataView.ToTable().Rows.Count; i++)
        {
            var dataRow = new Object[dtChartData.Columns.Count];
            dataRow[0] = ReportData.Rows[i]["Description"];
            dataRow[1] = csaConvert.ToDouble(ReportData.Rows[i]["Hours"]);
            dataRow[2] = ReportData.Rows[i]["Value"];
            dtChartData.Rows.Add(dataRow);
        }
        return dtChartData;
    }

次に、上記の表の要約データを使用して別のレポートを設計する必要があります。このテーブルは、Column ["Value]に基づいてすべての列のデータを組み合わせる必要があります。たとえば、私の場合、Value列1、2、3に3つの異なる値があります。結果のテーブルには、3つの値すべての時間を合計する必要があります。

    Value   Description  Hours
    1         A           5
    2         B           10
    3         C           8

これで、別のストアドプロシージャを作成することで、SQLでこれを行うことができますが、既存のデータテーブルを使用し、C#関数を記述して結果を取得したいと思います。LINQを使用してこれを実現する簡単な方法はありますか?

4

2 に答える 2

6

あなたは間違ったアプローチを取っています。この作業は SQL で行います。

 SELECT value, description, sum(hours) as hours from tblData group by value, description;

上記は、質問に表示する2番目の表を提供します。

このようにする理由は、クライアント アプリケーションにデータを渡して SQL に戻すだけでは、メモリとシステム コールが不必要に消費されるためです。また、エラー、バグ、型変換の問題などの余地がはるかに少なくなります。

より狭いテーブルを作成したい場合 (これは一般的には悪い考えです)、次のようにします。

 SELECT value, description, hours from tblData into tblSkinnyData;

一般に、何らかの理由でこのスキニー テーブルが必要な場合は、メイン テーブルで VIEW を使用します。

于 2012-09-23T12:51:27.663 に答える
2

AsEnumerable()LINQ を使用するために使用できます。次にGroupBy、最初の行を設定ValueしますDescriptionSumHours

var result = dtChartData.AsEnumerable()
            .GroupBy(row => new
                {
                    Value = row.Field<int>("Value"),
                    Description = row.Field<string>("Description")
                })
            .Select(g =>
                {
                    var row = g.First();
                    row.SetField("Hours", g.Sum(r => r.Field<double>("Hours")));

                    return row;
                });

結果は返さIEnumerable<DataRow>れますが、元に戻したい場合は次をDataTable使用します。

var resultTable = result.CopyToDataTable();
于 2012-09-23T12:49:55.473 に答える