c# – 在Pivot中包含更多行
发布时间:2020-12-15 07:42:00 所属栏目:百科 来源:网络整理
导读:我在下面的链接中使用扩展方法来转移我的数据: https://techbrij.com/pivot-c-array-datatable-convert-column-to-row-linq 我将链接中的代码包括在内,以防有人在将来发现此问题且链接已死: public static DataTable ToPivotTableT,TColumn,TRow,TData( th
我在下面的链接中使用扩展方法来转移我的数据:
https://techbrij.com/pivot-c-array-datatable-convert-column-to-row-linq 我将链接中的代码包括在内,以防有人在将来发现此问题且链接已死: public static DataTable ToPivotTable<T,TColumn,TRow,TData>( this IEnumerable<T> source,Func<T,TColumn> columnSelector,Expression<Func<T,TRow>> rowSelector,Func<IEnumerable<T>,TData> dataSelector) { DataTable table = new DataTable(); var rowName = ((MemberExpression)rowSelector.Body).Member.Name; table.Columns.Add(new DataColumn(rowName)); var columns = source.Select(columnSelector).Distinct(); foreach (var column in columns) table.Columns.Add(new DataColumn(column.ToString())); var rows = source.GroupBy(rowSelector.Compile()) .Select(rowGroup => new { Key = rowGroup.Key,Values = columns.GroupJoin( rowGroup,c => c,r => columnSelector(r),(c,columnGroup) => dataSelector(columnGroup)) }); foreach (var row in rows) { var dataRow = table.NewRow(); var items = row.Values.Cast<object>().ToList(); items.Insert(0,row.Key); dataRow.ItemArray = items.ToArray(); table.Rows.Add(dataRow); } return table; } 参考链接中的示例,您将获得数据透视图; var pivotTable = data.ToPivotTable( item => item.Year,item => item.Product,items => items.Any() ? items.Sum(x=>x.Sales) : 0); 我的问题是,如何在此查询中包含更多行以返回例如ProductCode .. item => new {item.Product,item.ProductCode}不起作用.. ============== EDIT / 2018年10月23日============== 假设我的数据是这样的; 借助上述代码,我可以设法做到这一点; 我想要实现的是这个(额外的col:STOCKID或任何其他cols); 解决方法
匿名类型不能作为通用参数传递.尝试将您的数据透视表键定义为结构:
public struct PivotKey { public string Product; public int ProductCode; // assuming your product codes are integers } 这样,您可以根据所有字段的相等和哈希代码利用struct的默认Equals和GetHashCode方法实现. 然后,定义rowSelector,如下所示: item => new PivotKey { Product = item.Product,ProductCode = item.ProductCode} (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |