如何用LinQ实现从输入ID列表返回数据库中不存在的ID(异步方法)
找出输入ID列表中不存在于数据库的ID
你的代码逻辑搞反了——当前代码是从数据库表中筛选出ID不在输入列表里的所有记录ID,这和你要的“找出输入列表里不在数据库表中的ID”完全是两个结果。
正确实现方式
最稳妥的写法是先从数据库查询出输入列表中已存在的ID,再用输入列表减去这些存在的ID:
public async Task<List<int>> NotExisting(List<int> inputIds, CancellationToken cancellationToken) { // 查询数据库中与输入列表重叠的ID var existingIds = await _dbContext.Table .Where(x => inputIds.Contains(x.Id)) .Select(x => x.Id) .ToListAsync(cancellationToken); // 从输入列表中排除已存在的ID,得到目标结果 return inputIds.Except(existingIds).ToList(); }
逻辑说明
- 第一步从数据库捞取所有在
inputIds里的ID,这一步会生成SQL的WHERE Id IN (...)语句,高效筛选出重叠数据; - 用Linq的
Except方法,从输入列表中移除所有已存在的ID,剩下的就是输入列表里不在数据库中的ID。
原代码问题解析
原代码的Where(x => !inputIds.Contains(x.Id))是遍历数据库表的每一条记录,判断这条记录的ID不在输入列表里就保留,最终返回的是数据库中所有不属于输入列表的ID,完全偏离了你的需求方向。
内容的提问来源于stack exchange,提问作者konrad8767
相关产品推荐
相关产品推荐

