如何用Linq查询语法按关联List<T>属性排序主List<T>
实现按指定年份销售额排序的LINQ解决方案
没问题,我来帮你搞定这个交叉表排序的需求!首先咱们得先明确两个列表对应的实体类结构(如果你的字段名和下面不一样,直接替换成你的实际字段就行):
// 员工总销售额实体 public class SalesTotals { public int EmployeeId { get; set; } public string EmployeeName { get; set; } public decimal TotalSales { get; set; } // 其他业务字段... } // 员工年度销售额实体 public class YearlySales { public int EmployeeId { get; set; } public int Year { get; set; } public decimal YearlyTotals { get; set; } // 其他业务字段... }
接下来就是核心的SortByYear方法实现,完全用LINQ查询语法做左连接,满足你的需求:
public List<SalesTotals> SortByYear(List<SalesTotals> salesTotals, List<YearlySales> yearlySales, int targetYear) { var sortedSales = from total in salesTotals // 左连接:匹配员工ID和指定年份的年度销售额记录 join yearly in yearlySales on new { total.EmployeeId, Year = targetYear } equals new { yearly.EmployeeId, yearly.Year } into groupedYearlySales // 处理无对应年份记录的情况,用DefaultIfEmpty()返回null from matchedYearly in groupedYearlySales.DefaultIfEmpty() // 排序规则:有年度记录用YearlyTotals,没有就用TotalSales orderby (matchedYearly != null ? matchedYearly.YearlyTotals : total.TotalSales) descending // 最终返回排序后的SalesTotals对象 select total; return sortedSales.ToList(); }
关键逻辑说明:
- 左连接实现:用
join ... into语法把匹配的年度销售额记录分组,再通过DefaultIfEmpty()确保即使没有对应年份的记录,也能保留SalesTotals的条目 - 排序规则:三元运算符判断是否存在指定年份的记录,存在则用年度销售额排序,否则 fallback 到总销售额
- 排序方向:示例里用的是
descending(降序),如果你的默认需求是升序,改成ascending就行
测试代码示例
你可以用下面的测试代码验证效果:
// 构造测试数据 var totalSales = new List<SalesTotals> { new() { EmployeeId = 1, EmployeeName = "Alice", TotalSales = 50000 }, new() { EmployeeId = 2, EmployeeName = "Bob", TotalSales = 45000 }, new() { EmployeeId = 3, EmployeeName = "Charlie", TotalSales = 55000 } }; var annualSales = new List<YearlySales> { new() { EmployeeId = 1, Year = 2024, YearlyTotals = 15000 }, new() { EmployeeId = 3, Year = 2024, YearlyTotals = 20000 } }; // 调用方法排序 var result = SortByYear(totalSales, annualSales, 2024); // 预期排序结果:Charlie(20000)→ Alice(15000)→ Bob(45000)
内容的提问来源于stack exchange,提问作者Scuzzlebutt
相关产品推荐
相关产品推荐

