Advertisement
Guest User

Untitled

a guest
Aug 20th, 2017
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.36 KB | None | 0 0
  1. public static DataTable PivotTable<T, TColumn, TGroupRow, TRow, TData>(
  2. this System.Collections.Generic.IEnumerable<T> list,
  3. Func<T, TColumn> column,
  4. Expression<Func<T, TRow>> row,
  5. Func<IEnumerable<T>, TData> dataSelector)
  6. {
  7. DataTable table = new DataTable();
  8. var rowName = ((MemberExpression)row.Body).Member.Name;
  9. table.Columns.Add(new DataColumn(rowName));
  10. var columns = list.Select(column).Distinct();
  11.  
  12. foreach (var col in columns)
  13. table.Columns.Add(new DataColumn(col.ToString()));
  14.  
  15. var rows = list.GroupBy(row.Compile())
  16. .Select(rowGroup => new
  17. {
  18. Key = rowGroup.Key,
  19. Values = columns.GroupJoin(
  20. rowGroup,
  21. c => c,
  22. r => column(r),
  23. (c, columnGroup) => dataSelector(columnGroup))
  24. });
  25.  
  26. foreach (var rowVal in rows)
  27. {
  28. var dataRow = table.NewRow();
  29. var items = rowVal.Values.Cast<object>().ToList();
  30.  
  31. items.Insert(0, rowVal.Key);
  32.  
  33. dataRow.ItemArray = items.ToArray();
  34. table.Rows.Add(dataRow);
  35. }
  36.  
  37. return table;
  38. }
  39.  
  40. var _dataSourceMatrix = //Some logic that get the DataTable records
  41. var _departmentList = //Some logic that get the DataTable records
  42.  
  43. var _joinDataSourceDepartmentList = from a in _dataSourceMatrix.AsEnumerable()
  44. join b in _departmentList.AsEnumerable()
  45. on a.Field<int>("EntityID") equals b.Field<int>("DepartmentID")
  46. select new { EntityName = b.Field<string>("Name"), Period = a.Field<string>("Period"), Value = a.Field<double>("Value"), EntityID = a.Field<int>("EntityID") };
  47.  
  48. _dataSourceMatrix = _joinDataSourceDepartmentList .OrderBy(x => x.Period).PivotTable(x => x.Period, x => x.EntityName, x => x.Sum(y => y.Value));
  49.  
  50. EntityName Period1, Period2, Period3, EntityID
  51. A Value1 Value2 Value3 1
  52. B Value1 Value2 Value3 2
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement