使用LINQ移除列表重复项并保留重复数据中日期最新的行
实现方法
核心逻辑是按员工唯一标识分组后,每组取薪资日期最新的单条记录,具体LINQ写法如下:
方式1:直接在原查询链中追加逻辑(推荐,性能更高)
直接在原有查询后追加分组、取最新值的逻辑,不需要先加载全量数据到内存:
List<EmployeeSalary> lstEmployeeSalary = new EmployeeSalaryFactory().GetRelatedObjects(inValue, ddlPayDate, payRollType, payrollSearch) .Select(m => (EmployeeSalary)m) // 按员工唯一标识分组,示例用员工Id,可按需替换为EmpCode或组合字段 .GroupBy(emp => emp.Id) // 每组内按薪资日期降序排序,取第一条即最新记录 .Select(group => group.OrderByDescending(emp => emp.DateOfSalary).First()) .ToList();
方式2:对已获取的原始列表做去重处理
如果已经拿到了原始的lstEmployeeSalary列表,可直接对列表做处理:
lstEmployeeSalary = lstEmployeeSalary .GroupBy(emp => emp.Id) .Select(group => group.OrderByDescending(emp => emp.DateOfSalary).First()) .ToList();
注意事项
- 如果员工唯一标识是工号
EmpCode,把GroupBy(emp => emp.Id)替换为GroupBy(emp => emp.EmpCode)即可 - 如果需要用多个字段组合判断为同一员工,可使用匿名类分组:
GroupBy(emp => new { emp.Id, emp.EmpCode }) - 请确保
DateOfSalary为DateTime类型,避免字符串日期排序异常;如果是字符串存储的日期,需要先转成DateTime再参与排序 - 如果
GetRelatedObjects返回的是IQueryable类型,方式1的逻辑会自动翻译成SQL在数据库侧执行,性能远高于全量拉取到内存后处理
内容的提问来源于stack exchange,提问作者coder rock
相关产品推荐
相关产品推荐

