2011-12-12 14 views
12

私は別のDataTableを作成するためにDataTableで集計クエリを実行したいと思います。私は最初のDataTableを作成するために使用されているSQLを変更することはできません。効率的なDataTableグループ

オリジナルのDataTable:(すべてがint型である)

TeamID | MemberID 
-------|----------- 
1  | 1 
1  | 2 
1  | 3 
2  | 4 
2  | 5 

望ましい結果:

TeamID | MemberIDCount 
-------|-------------- 
1  | 3 
2  | 2 

それは私がちょうど

Select TeamID, Count(*) From Table Group By TeamID 

が、私のアプリケーションで操作を行うことができSQLた場合は、これを処理する方法を知っている唯一の方法は次のようなものです:

Dictionary<int,int> d = new Dictionary<int,int>(); 
foreach (DataRow dr in dt.Rows) 
{ 
    if (d.ContainsKey(dr.ID)) 
    { 
     d[dr.ID] = d[dr.ID] + 1; 
    } 
    else 
    { 
     d.Add(dr.ID, 1); 
    } 
} 

良い方法はありますか?

答えて

26

あなたはLINQのを使用することができます。 `System.Data.DataSetExtensions`アセンブリを使用するための

var result = from row in dt.AsEnumerable() 
       group row by row.Field<int>("TeamID") into grp 
       select new 
       { 
       TeamID = grp.Key, 
        MemberCount = grp.Count() 
        }; 
foreach (var t in result) 
    Console.WriteLine(t.TeamID + " " + t.MemberCount); 
+0

+1。 – Oliver

+1

は素晴らしい作品です!ありがとう! –

12
public DataTable GroupBy(string i_sGroupByColumn, string i_sAggregateColumn, DataTable i_dSourceTable) 
{ 

    DataView dv = new DataView(i_dSourceTable); 

    //getting distinct values for group column 
    DataTable dtGroup = dv.ToTable(true, new string[] { i_sGroupByColumn }); 

    //adding column for the row count 
    dtGroup.Columns.Add("Count", typeof(int)); 

    //looping thru distinct values for the group, counting 
    foreach (DataRow dr in dtGroup.Rows) { 
     dr["Count"] = i_dSourceTable.Compute("Count(" + i_sAggregateColumn + ")", i_sGroupByColumn + " = '" + dr[i_sGroupByColumn] + "'"); 
    } 

    //returning grouped/counted result 
    return dtGroup; 
} 

例:

DataTable desiredResult = GroupBy("TeamID", "MemberID", dt); 
1

LINQでグループ化

var listInfo = (from infoMember in context.Members 
       where infoMember.TeamID == TeamID 
       group infoMember by new 
       { infoMember.TeamID, infoMember.MemberIDCount } into newInfoMemeber 
       select new ClassName 
       { 
        TeamID = newInfo.Key.TeamID, 
        MemberIDCount = newInfo.Key.MemberIDCOunt, 
        Count = newInfo.Count(), 
        TotalCount = (from infoMemeber2 in context.Members 
           where infoMemeber2.TeamID== TeamID 
           select infoResult2).Count() 
       }).AsEnumerable(); 
関連する問題