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

C#验证CSV中所有产品编码是否均存在于PRODUCT数据库

验证CSV产品编码是否存在于数据库的实现方案

你已经完成了核心的两步:提取CSV中去重的产品编码、从数据库匹配存在的编码。接下来只需要通过差集对比找出CSV中无效的编码,再完成验证逻辑即可,完整实现如下:

//StockBatchItemDto 是用于上传CSV数据的DTO
records = csvReader.GetRecords<StockBatchItemDto>().ToList();
var productCodes = records
                    .Select(record => record.ProductCode)
                    .Distinct()
                    .ToList();

// 从数据库查询所有匹配的产品编码
var matchProducts = await _dbContext.Products
    .Where(prod => productCodes.Contains(prod.Code))
    .Select(prod => prod.Code).ToListAsync();

// 找出CSV中存在但数据库里没有的编码(差集)
var invalidProductCodes = productCodes.Except(matchProducts).ToList();

// 验证逻辑:如果有无效编码,抛出异常或返回错误提示
if (invalidProductCodes.Any())
{
    // 可以自定义异常,或者拼接错误信息返回给前端
    throw new InvalidOperationException($"以下产品编码不存在于数据库中:{string.Join(", ", invalidProductCodes)}");
}

// 到这里说明所有CSV产品编码都有效,继续后续导入逻辑

关键部分解释:

  • Distinct():对CSV的产品编码去重,减少数据库查询的IN语句长度,提升查询效率,避免重复检查相同编码。
  • Contains():EF Core会将其转换为SQL的IN语句,一次性查询所有匹配的编码,比循环单个查询高效得多。
  • Except():LINQ的差集方法,返回productCodes中有但matchProducts中没有的元素,精准定位无效编码。
  • 大小写敏感处理(可选):如果数据库的Code字段大小写敏感,建议统一转换为相同大小写后再对比,比如:
    var productCodes = records
                        .Select(record => record.ProductCode?.Trim().ToUpperInvariant())
                        .Distinct()
                        .ToList();
    
    var matchProducts = await _dbContext.Products
        .Where(prod => productCodes.Contains(prod.Code.Trim().ToUpperInvariant()))
        .Select(prod => prod.Code.Trim().ToUpperInvariant()).ToListAsync();
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 20:41:06