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

文件重复校验代码优化咨询:同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();
}

关键修改说明

  1. 修正重复校验逻辑
    使用AnyAsync()方法直接查询数据库中是否存在同时满足FileNo和VendorId匹配的记录,数据库会高效遍历所有符合条件的数据,只要存在一条匹配记录就返回true,彻底解决原代码只校验首个匹配记录的问题。

  2. 优化逻辑顺序
    将ModelState校验放在最前面,避免模型无效时执行不必要的数据库查询,提升性能。

  3. 简化跳转逻辑
    用C# 8.0+的switch表达式替代原有的多分支else if,代码结构更清晰易维护(如果项目兼容旧版本C#,可改回原else if写法,不影响核心校验逻辑)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 22:40:56