Эффективная группа 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 

Если бы это был SQL, я мог бы просто сделать

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

но в моем приложении единственный способ, которым я знаю, как справиться с этим, будет примерно таким:

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

Есть ли способ лучше?

Вы можете использовать Linq.

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

Группа в 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(); 
  • Связывание WPF DataGrid с DataTable с использованием TemplateColumns
  • Динамически генерировать h: столбец на основе списка hashmaps
  • Преобразование DataTable в stream CSV
  • Как использовать в или для выбора нескольких элементов?
  • Как привязать DataTable к Datagrid
  • Как изменить тип данных DataColumn в DataTable?
  • Как настроить свойства конвертера для каждой строки данных?
  • Как сравнить 2 таблицы данных
  • Как передать выбранную строку в commandLink внутри dataTable или ui: repeat?
  • DataTable, Как условно удалить строки
  • Как выбрать различные строки в datatable и хранить в массиве
  • Давайте будем гением компьютера.