2011-12-12 37 views
12

Tôi muốn thực hiện truy vấn tổng hợp trên một DataTable để tạo một DataTable khác. Tôi không thể thay đổi SQL đang được sử dụng để tạo ra DataTable ban đầu.Nhóm DataTable hiệu quả theo số

gốc DataTable: (tất cả mọi thứ là một int)

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

kết quả mong muốn:

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

Nếu nó là SQL Tôi chỉ có thể làm

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

nhưng trong ứng dụng của tôi, cách duy nhất tôi biết làm thế nào để xử lý này sẽ là một cái gì đó như thế này:

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); 
    } 
} 

Có cách nào tốt hơn không?

Trả lời

26

Bạn có thể sử dụng LINQ.

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 để sử dụng 'System.Data.DataSetExtensions' lắp ráp. – Oliver

+1

hoạt động tuyệt vời! cảm ơn! –

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; 
} 

Ví dụ:

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

Nhóm Bởi trong 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(); 
Các vấn đề liên quan