1

C# を使用して Windows アプリケーションを開発しました。DataTable を使用してすべての情報を一覧表示しました。そのデータ テーブルには重複した値があります。

私の結果:

Lead Owners             <2Days  <5Days  <10Days <20Days >20Days Grand-Total
Dan Mahoney                                1                
Richard James Whitaker            1             
Richard James Whitaker            1             
Richard James Whitaker            1             
Richard James Whitaker            1             
Wayne Dunne              1              
Wayne Dunne              1              
Richard James Whitaker            1             
Wayne Dunne              1              
Richard James Whitaker            1             
Richard James Whitaker            1             

期待される結果:

Lead Owners             <2Days  <5Days  <10Days <20Days >20Days Grand-Total
Dan Mahoney                                1                
Richard James Whitaker            7             
Wayne Dunne              3              

期待される結果を得るには、linq クエリが必要です。

これを手に入れるのを手伝ってください。前もって感謝します。

4

2 に答える 2

2

集計値を含む新しいを作成する場合、DataTableLINQ はタスク全体に最適なツールではありません。DataTable.Clone同じスキーマで空のテーブルを作成するために使用する必要があります。

Enumerable.GroupBy次に、ソース テーブルのキー列で使用できます。DataRow最後に、ループを使用してs に集計値を追加します。

var ownerGroups = dt.AsEnumerable()
    .GroupBy(row => row.Field<string>("Lead Owners"));
var dt2 = dt.Clone();
var intColumns = dt2.Columns.Cast<DataColumn>()
    .Where(c => c.DataType == typeof(int)).ToArray();
foreach (var grp in ownerGroups)
{
    var row = dt2.Rows.Add();
    row.SetField("Lead Owners", grp.Key);
    foreach (DataColumn col in intColumns)
    {
        bool anyNonNull = grp.Any(r => r.Field<int?>(col.Ordinal).HasValue);
        int? sum = anyNonNull ? grp.Sum(r => r.Field<int?>(col.Ordinal)) : null;
        row.SetField(col, sum);
    }
}

数値列のタイプはint.

結果のテーブル:

Dan Mahoney                 null        null       1
Richard James Whitaker      null        7          null 
Wayne Dunne                 3           null       null 
于 2013-11-07T11:54:20.513 に答える
2
from r in table.AsEnumerable()
group r by r.Field<string>("Lead Owners") into g
select new {
   LeadOwners = g.Key,
   2Days = g.Sum(r => r.Field<int?>("2Days")),
   5Days = g.Sum(r => r.Field<int?>("5Days"))
   // etc
}

本当に DataTable にする必要がある場合は、CopyToDataTable メソッドを使用して、クエリ結果から新しい DataTable を作成できます:クエリからの DataTable の作成

于 2013-11-07T11:43:53.267 に答える