如何使用Linq查找并删除数据库中与请求不匹配的员工上传记录
业务需求
实现员工信息编辑功能时,同步处理员工关联的上传文件记录:员工ID为1的原有2条关联上传记录,用户编辑时删除了ID为2的图片,前端提交编辑后的Employee模型到后端后,后端需要筛选出数据库存在但前端请求中不存在的不匹配记录并删除,本次需删除上传表ID为2的记录。
相关结构定义
上传表
| Id | File Name | URL | EmployeeId |
|---|---|---|---|
| 1 | home.jpg | C:\home.jpg | 1 |
| 2 | flower.jpg | C:\flower.jpg | 1 |
UploadItem模型类
public class UploadItem() { [Key] public int Id{get;set;} public string FileName {get;set;} public string URL {get;set;} public int EmployeeId {get;set;} }
员工表
| Id | Employee Name | PhoneNo |
|---|---|---|
| 1 | Joseph | 89772 |
| 2 | rosy | 3244 |
Employee模型类
public class Employee() { [Key] public int Id{get;set;} public string EmployeeName {get;set;} public int PhoneNo{get;set;} public List<IFormFile> files {get;set;} public List<UploadItem> uploadfiles {get;set;} }
现有问题代码
原有筛选逻辑无法正确匹配到需要删除的记录:
[HTTPPOST("EditEmployee")] public async Task<IActionResult> EditEmployee([FormFrom] Employee model) { if(model.uploadfiles.Count>0) { var uploadRecordsFromDB= dbContext.Uploads.Where(x=>x.EmployeeId==model.Id).ToList(); var uploadRecordsFromRequest=model.uploadfiles; // 查找不匹配记录方法1: var unMatchedRecords = uploadRecordsFromDb.Where(x=> !uploadRecordsFromRequest.Contains(x)).ToList(); // 查找不匹配记录方法2: var unMatchedRecords1= uploadRecordsFromDB.Where(i => !uploadRecordsFromRequest.Contains(i)).ToList(); } }
错误原因
UploadItem是引用类型,默认Contains方法执行的是引用相等性比较:前端提交的uploadfiles里的实例和数据库查询出来的实例不是同一个内存对象,就算所有属性值完全一致,Contains也会返回false,因此筛选逻辑完全失效。
修正方案
通过主键ID进行值匹配来筛选要删除的记录,修改后代码如下:
[HttpPost("EditEmployee")] public async Task<IActionResult> EditEmployee([FromForm] Employee model) { // 先查询该员工所有已存在的上传记录 var uploadRecordsFromDB = await dbContext.Uploads.Where(x => x.EmployeeId == model.Id).ToListAsync(); if (model.uploadfiles != null && model.uploadfiles.Any()) { // 提取前端提交的、已存在的历史上传记录的ID集合(新上传的文件没有ID,不用纳入匹配) var reservedUploadIds = model.uploadfiles .Where(x => x.Id > 0) .Select(x => x.Id) .ToHashSet(); // 筛选数据库存在、但前端提交的列表中没有的记录,就是用户要删除的记录 var toDeleteRecords = uploadRecordsFromDB .Where(x => !reservedUploadIds.Contains(x.Id)) .ToList(); // 删除不匹配记录 if (toDeleteRecords.Any()) { dbContext.Uploads.RemoveRange(toDeleteRecords); // 如果需要同步删除本地/OSS存储的文件,也可以在这里遍历执行删除逻辑 } } else { // 如果前端没有提交任何上传记录,说明用户删除了所有关联文件,直接删除该员工所有上传记录 dbContext.Uploads.RemoveRange(uploadRecordsFromDB); } // 后续员工信息更新逻辑省略... await dbContext.SaveChangesAsync(); return Ok(); }
最终效果
操作完成后,员工ID=1的上传表剩余记录如下:
| Id | File Name | URL | EmployeeId |
|---|---|---|---|
| 1 | home.jpg | C:\home.jpg | 1 |
内容的提问来源于stack exchange,提问作者user16490152
相关产品推荐
相关产品推荐

