文件重复校验代码优化咨询:同FileNo+VendorId重复拦截问题
问题分析与代码修改方案
原代码的核心问题在于:仅查询首个FileNo(对应字段Number)匹配的记录,再通过该记录的VendorId判断是否重复——这种逻辑会遗漏其他FileNo相同且VendorId一致的记录,导致重复数据无法被正确拦截。
修改后的代码
public async Task<IActionResult> OnPostAsync() { // 优先校验模型合法性,无效直接返回页面 if (!ModelState.IsValid) { return Page(); } // 直接查询数据库:是否存在同时匹配FileNo和VendorId的记录 bool hasDuplicate = await _context.Files.AnyAsync(x => x.Number == Files.Number && x.VendorId == Files.VendorId); if (!hasDuplicate) { _context.Files.Add(Files); await _context.SaveChangesAsync(); // 简化跳转逻辑,用switch表达式提升可读性 return Files.FileType switch { "Purchase Order" => LocalRedirect("~/PurchaseOrders"), "Remittance" => LocalRedirect("~/Remittance"), "Growers Return" => LocalRedirect("~/GrowersReturn"), "Haulage Self Bill" => LocalRedirect("~/HaulageSelfBill"), _ => RedirectToPage("./Index") }; } else { ViewData["error"] = "Exists"; } return Page(); }
关键修改说明
修正重复校验逻辑
使用AnyAsync()方法直接查询数据库中是否存在同时满足FileNo和VendorId匹配的记录,数据库会高效遍历所有符合条件的数据,只要存在一条匹配记录就返回true,彻底解决原代码只校验首个匹配记录的问题。优化逻辑顺序
将ModelState校验放在最前面,避免模型无效时执行不必要的数据库查询,提升性能。简化跳转逻辑
用C# 8.0+的switch表达式替代原有的多分支else if,代码结构更清晰易维护(如果项目兼容旧版本C#,可改回原else if写法,不影响核心校验逻辑)。
内容的提问来源于stack exchange,提问作者Megan Paterson
相关产品推荐
相关产品推荐

