如何用SQL、Lambda或LINQ无循环实现数据分组与列表更新
没问题!完全可以摆脱循环,用SQL或者LINQ/Lambda轻松搞定你的需求,分两种场景给你具体方案:
1. SQL 数据库直接取数分组方案
如果数据存在数据库里,直接用SQL就能完成修正MainName+分组归类的操作,不用把数据拉到程序里处理。下面以SQL Server为例(其他数据库类似,聚合函数略有差异):
SELECT -- 先把XWY修正为XYZ,生成修正后的主名称字段 CASE WHEN MainName = 'XWY' THEN 'XYZ' ELSE MainName END AS CorrectedMainName, -- 把同组的CompanyName用逗号拼接(SQL Server 2017+支持STRING_AGG) STRING_AGG(CompanyName, ', ') AS AssociatedCompanies, -- 同理拼接ChildName STRING_AGG(ChildName, ', ') AS AssociatedChildNames FROM YourTableName -- 替换成你的实际表名 -- 按修正后的主名称分组 GROUP BY CASE WHEN MainName = 'XWY' THEN 'XYZ' ELSE MainName END;
如果是MySQL数据库,把STRING_AGG换成GROUP_CONCAT即可,语法逻辑完全一致。
2. .NET 列表处理(LINQ/Lambda方案)
如果数据已经在程序的列表里(比如C#的List<T>),用LINQ链式调用就能完成,全程不用写手动循环:
首先假设你的数据模型是这样的:
public class CompanyItem { public string CompanyName { get; set; } public string MainName { get; set; } public string ChildName { get; set; } }
然后处理代码:
// 假设companyList是你的原始数据列表 var processedGroups = companyList // 第一步:修正MainName,生成新的对象(也可以直接修改原对象,看需求) .Select(item => new CompanyItem { CompanyName = item.CompanyName, MainName = item.MainName == "XWY" ? "XYZ" : item.MainName, ChildName = item.ChildName }) // 第二步:按修正后的MainName分组 .GroupBy(item => item.MainName) // 第三步:把分组结果转成你需要的结构(比如Key是主名称,值是对应公司集合) .Select(group => new { MainName = group.Key, CompanyDetails = group.Select(item => new { item.CompanyName, item.ChildName }).ToList() }) .ToList();
如果你想直接修改原列表里的MainName(而不是生成新对象),可以用List的ForEach方法(虽然不是LINQ扩展,但也不用手动写循环):
// 先修正原列表的MainName companyList.ForEach(item => item.MainName = item.MainName == "XWY" ? "XYZ" : item.MainName); // 再分组 var groupedResult = companyList.GroupBy(item => item.MainName) .Select(group => new { MainName = group.Key, Companies = group.ToList() }) .ToList();
内容的提问来源于stack exchange,提问作者AliAzra
相关产品推荐
相关产品推荐

