2011-07-01 118 views
7

データテーブルには、文字列、日付時刻、および小数の3つの列があります。私は文字列と小数点の列でグループ化したい、グループ化された行のために小数点の値を合計したい。私は合計部分を行う方法を知っていますが、データテーブル内の2つの異なる列をどのようにグループ化しますか?c#linqを使用してデータテーブルの複数の列でグループ化する

これは、これまで正常に動作しない私のコードです:

var newSort = from row in objectTable.AsEnumerable() 
       group row by new {ID = row.Field<string>("resource_name"), time1 = row.Field<DateTime>("day_date")} into grp 
       orderby grp.Key 
       select new 
       { 
       resource_name1 = grp.Key.ID, 
       day_date1 = grp.Key.time1, 
       Sum = grp.Sum(r => r.Field<Decimal>("actual_hrs")) 
       }; 
+1

"コンパイラはすべてのobj ectsは同じなので、すべての行がグループ化されます。 " - すべてのオブジェクトが1つの大きなグループに入れられることを意味するので、' newSort'コレクションには1つのアイテムしかありません。 – StriplingWarrior

+0

はい、newSortにはデータテーブルの最後の要素しか含まれていません – Sam

+0

クエリは正しく表示されます。入力を確認して再確認できますか? – StriplingWarrior

答えて

14

私はあなたが私たちに完全な物語を与えているとは思いません。 orderbyが匿名型で動作しない場合(あなたが指定したコードはコンパイルされません)、クエリはあなたの望むように動作するはずです。

var objectTable = new DataTable(); 
objectTable.Columns.Add("resource_name",typeof(string)); 
objectTable.Columns.Add("day_date",typeof(DateTime)); 
objectTable.Columns.Add("actual_hrs",typeof(decimal)); 
objectTable.Rows.Add(1, DateTime.Today, 1); 
objectTable.Rows.Add(2, DateTime.Today, 2); 

var newSort = from row in objectTable.AsEnumerable() 
      group row by new {ID = row.Field<string>("resource_name"), time1 = row.Field<DateTime>("day_date")} into grp 
      select new 
       { 
        resource_name1 = grp.Key.ID, 
        day_date1 = grp.Key.time1, 
        Sum = grp.Sum(r => r.Field<Decimal>("actual_hrs")) 
       }; 
newSort.Dump(); 

を...と私は、これらの結果だ:私はちょうどLINQPadでこれを入れVb.netでソリューションをしたいという人のために

resource_name1 | day_date1   | Sum 
1    | 7/1/2011 12:00:00 AM | 1 
2    | 7/1/2011 12:00:00 AM | 2 
+0

2つの他の列のMIN値に基づいて、上記の各グループから1行を引き出すにはどうすればいいですか? – Si8

+0

@ Si8: 'grp.OrderBy(g => g.col1 + g.col2).FirstOrDefault()'? – StriplingWarrior

3

このコードを使用

var newSort = from row in objectTable.AsEnumerable() 
      group row by new {ID = row.Field<string>("resource_name"), time1 = row.Field<DateTime>("day_date")} into grp 
      orderby grp.Key 
      select new 
      { 
      resource_name1 = grp.Key.ID, 
      day_date1 = grp.Key.time1, 
      Sum = grp.Sum(r => Convert.ToDecimal(r.ItemArray[2])) 
      }; 
0

をここに例があります:

Dim workTable As DataTable = New DataTable("Customers") 

Dim workCol As DataColumn = workTable.Columns.Add("ID", Type.GetType("System.Int32")) 
workTable.Columns.Add("Total", Type.GetType("System.Decimal")) 
workTable.Columns.Add("Compra", Type.GetType("System.Decimal")) 

Dim row As DataRow = workTable.NewRow() 
row("id") = 2 
row("total") = 1.5 
row("compra") = 3 
workTable.Rows.Add(row) 
row = workTable.NewRow() 

row("id") = 1 
row("total") = 1.5 
row("compra") = 3.3999999999999999 
workTable.Rows.Add(row) 
row = workTable.NewRow() 
row("id") = 1 
row("total") = 1.5 
row("compra") = 5 
workTable.Rows.Add(row) 


Dim detalles As IEnumerable(Of DataRow) = workTable.AsEnumerable() 

Dim query = From detalle In detalles.AsEnumerable() _ 
      Group detalle By grupoClave = New With _ 
             { _ 
              Key .C2 = detalle("id"), _ 
              Key .C4 = detalle("total")} Into g = Group _ 
            Select New With _ 
            { _ 
             .Col2 = g(0).Field(Of Integer)("id"), _ 
             .Col3 = g(0).Field(Of Decimal)("total"), _ 
             .Col4 = g.Sum(Function(fact) fact.Field(Of Decimal)("compra")) _ 
            } 

For Each p In query 
    Console.WriteLine((p.Col2 & p.Col3 & p.Col4)) 
Next 
関連する問題