2012-09-23 109 views
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中有三個不同的值,結果表中的所有三個值。

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

現在我可以在SQL中通過創建另一個存儲過程做到這一點,但我寧願用我現有的數據表,寫一個C#函數來得到結果。有沒有一種更簡單的方式來實現這一目標使用LINQ ?

回答

2

可以爲了使用LINQ,然後通過ValueDescriptionGroupBy使用AsEnumerable()和做到第一行設置:

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(); 
+0

謝謝你的幫助。奇蹟般有效。 –

+0

@Cuong le:它給我什麼我完全搜索.Thanq非常多 – shafi7468

6

你採取錯誤的做法。在SQL中執行此操作。

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

以上將給出您在問題中顯示的第二張表格。

這樣做的原因是,將數據傳遞到客戶端應用程序只是爲了讓它直接返回到SQL而不必要地消耗內存和系統調用。此外,還有餘地越來越小錯誤,錯誤類型轉換的問題,等等。

如果你真的想使窄表(通常是一個壞主意),像這樣做:

SELECT value, description, hours from tblData into tblSkinnyData; 

一般來說,如果你出於某種原因需要這個小巧的表,你可以在主表上使用VIEW。

+0

感謝您的建議。我通常會使用sql進行數據表上的任何操作。但是這次我不得不用代碼來完成。另外,數據只傳遞給客戶端應用程序一次,也就是加載頁面的時間。一旦我有我的大數據表,我使用代碼從中提取小表。 –

相關問題