如何在LINQ与EF Core中按CustomerId全量分组Task和Report表?
解决方案:按CustomerId全量分组Task和Report并生成GroupedItems结果
1. 定义统一DTO
由于Task和Report结构不同,需要先创建一个通用DTO来承载两类数据,确保能放入同一个集合中:
public class ReportTaskDTO { public int? TaskId { get; set; } public string? Description { get; set; } public int? ReportId { get; set; } public string? Summary { get; set; } public int CustomerId { get; set; } // 标识条目类型,方便后续区分Task/Report public string ItemType { get; set; } }
2. 转换并合并数据源
将Task和Report表的数据转换为DTO,再合并成全量集合(保留所有记录,不会丢失无匹配的CustomerId):
// 假设tasks是从数据库获取的IEnumerable<Task>,reports是IEnumerable<Report> var taskDtos = tasks.Select(t => new ReportTaskDTO { TaskId = t.TaskId, Description = t.Description, CustomerId = t.CustomerId, ItemType = "Task" }); var reportDtos = reports.Select(r => new ReportTaskDTO { ReportId = r.ReportId, Summary = r.Summary, CustomerId = r.CustomerId, ItemType = "Report" }); // 合并两个DTO集合,得到所有Task和Report的全量记录 var combinedDtos = taskDtos.Concat(reportDtos);
3. 分组生成目标结果
按CustomerId分组,并组装成你需要的GroupedItems<ReportTaskDTO>类型:
var groupedResult = combinedDtos .GroupBy(dto => dto.CustomerId) .Select(group => new GroupedItems<ReportTaskDTO> { GroupName = $"CustomerId: {group.Key}", GroupCount = group.Count(), // 组内Task+Report的总数量 Items = group.ToList() }) .OrderBy(g => g.GroupKey) // 按CustomerId升序排序,匹配期望的分组顺序 .ToList();
4. (可选)输出为你展示的文本格式
如果需要将结果打印成示例中的格式,可以遍历分组结果:
int groupIndex = 1; foreach (var group in groupedResult) { Console.WriteLine($"**分组{groupIndex}: {group.GroupName} 计数({group.GroupCount})**"); foreach (var item in group.Items) { Console.WriteLine(item.ItemType == "Task" ? $"TaskId {item.TaskId}" : $"ReportId {item.ReportId}"); } Console.WriteLine("--------------------------------------"); groupIndex++; }
内容的提问来源于stack exchange,提问作者Maryam Afzal
相关产品推荐
相关产品推荐

