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
相关产品推荐
相关产品推荐

