You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从Payment表重复记录中提取唯一未缴费员工的Emp_id和name?

解决指定日期未缴费员工的唯一列表问题

原代码存在的问题

  1. 条件判断错误:td.Emp_Id == empIds 中,empIds是列表,不能直接用==比较,需用Contains方法判断员工ID是否在目标列表中
  2. 分组逻辑偏差:按emp_Id和Payment_month分组无法保证员工唯一,应仅按emp_Id(或emp_Id+name)分组
  3. 核心逻辑不准确:筛选Payment_month != date的记录再去重,会拿到员工其他月份的缴费记录,本质是找“有其他月份缴费但当前月未缴”的员工,而非“当前月完全无缴费记录”的员工

修正后的实现方案

我们需要的是:从目标员工列表中,排除掉指定日期有缴费记录的员工,剩余即为未缴费员工,且每个员工仅返回唯一的Emp_id和name

方案一:集合差集高效实现

// 1. 获取所有需要检查缴费状态的员工ID列表
var targetEmpIds = db.UnRegistrations.Select(e => e.emp_Id).ToList();

// 2. 获取指定日期已缴费的员工ID(自动去重)
var paidEmpIds = db.UnContributions
    .Where(td => td.Payment_month == date)
    .Select(td => td.Emp_Id)
    .Distinct()
    .ToList();

// 3. 计算未缴费员工ID(求两个集合的差集)
var unpaidEmpIds = targetEmpIds.Except(paidEmpIds).ToList();

// 4. 获取未缴费员工的唯一Emp_id和name
var unpaidContributions = db.UnContributions
    .Where(td => unpaidEmpIds.Contains(td.Emp_Id))
    .GroupBy(td => new { td.Emp_Id, td.name }) // 按员工ID+姓名分组确保唯一
    .Select(group => group.First())
    .ToList();

方案二:Linq关联查询一步到位

如果UnRegistrations表本身包含员工姓名,可直接关联查询,无需重复访问UnContributions拿姓名:

var targetDate = // 你的指定缴费日期
var unpaidContributions = db.UnRegistrations
    .Where(reg => !db.UnContributions
        .Any(c => c.Emp_Id == reg.emp_Id && c.Payment_month == targetDate))
    .Select(reg => new { reg.emp_Id, reg.name }) // 直接取唯一的员工ID和姓名
    .ToList();

关键说明

  • 用Except或Any判断员工是否有指定日期的缴费记录,比筛选Payment_month != date逻辑更准确,避免混入员工其他月份的记录
  • 通过分组或直接从员工注册表取数据,确保每个员工仅出现一次
  • 原代码中cbeIds未定义,推测为笔误,已替换为合理逻辑

内容的提问来源于stack exchange,提问作者getnet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 00:23:39