最简单的分组
var conHistoryList = conHistoryData.GroupBy(g => g.personId);
就是conHistoryData是一个IQueryable<T>类型;
分组后组内排序
var conHistoryList = conHistoryData.GroupBy(g => g.personId).Select(g => g.OrderBy(c => c.addTime));
对数据分组之后在根据每一个分组内的某一个元素排序。
分组后排序返回第一个
var conHistoryList = conHistoryData.GroupBy(g => g.personId).Select(g => g.OrderBy(c => c.addTime).FirstOrDefault()).ToList();
对数据分组之后在根据每一个分组内的某一个元素排序。排序之后在返回第一个元素,然后组成一个集合返回。这个实现的是根据分组取组内第一个元素然后重新返回一个元素列表。
使用组内元素
var dd = conHistoryData.GroupBy(g => g.personId); //获取每个分组的键 foreach (var item in dd) { string GroupByKey = item.Key; //获取每个分组的内容 foreach (var item2 in item) { ContractHistoryInfor historyInfor = item2; } }
多次分组组合
var childDetailListData = new List<ChildFactDetailInfor>(); var childDetailListG = childDetailList.GroupBy(b => b.materialCategory).Select(g => g.GroupBy(b => b.materialNum));
childDetailList是一个List<ChildFactDetailInfor>集合。通过先分组materialCategory字段,然后在在分组内根据materialNum字段再次分组。
使用多次分组的元素
var childDetailListData = new List<ChildFactDetailInfor>(); var childDetailListG = childDetailList.GroupBy(b => b.materialCategory).Select(g => g.GroupBy(b => b.materialNum)); foreach (var item in childDetailListG) { foreach (var item2 in item) { decimal? a = item2.Sum(x => x.materialNum); decimal? c = item2.Sum(x => x.priceTotal); foreach (var item3 in item2) { item3.materialNum = a; item3.priceTotal = c; childDetailListData.Add(item3); } } }
和上面使用元素差不多就是遍历层数
补充记录一个linq左连接多表关联去除控数据示例:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)