使用C# Blazor与CSVHelper避免CSV重复数据插入SQL Server的报错解决
解决CS1503类型转换错误的方案
错误原因
你代码里的workordersindb是从数据库查询得到的JobInfo实体集合(IEnumerable<JobInfo>),但x.WorkOrder是int类型,Contains方法无法直接把int和JobInfo实体做比较,这就导致了类型不匹配的CS1503错误。
解决步骤
- 提取数据库中已存在的WorkOrder值集合
不要直接查询整个JobInfo实体,而是只取出WorkOrder字段的数值:
// 从数据库获取所有已存在的WorkOrder数值 var existingWorkOrders = _context.JobInfos.Select(j => j.WorkOrder).ToList();
- 过滤CSV中的新记录
用上面的数值集合匹配CSV记录的WorkOrder,筛选出数据库中没有的数据:
var workordersNotindb = records.Where(x => !existingWorkOrders.Contains(x.WorkOrder));
- 性能优化(可选)
如果数据库中WorkOrder数据量较大,用HashSet<int>替代List<int>能显著提升Contains方法的查询效率:
var existingWorkOrders = new HashSet<int>(_context.JobInfos.Select(j => j.WorkOrder));
- 数据库层面防重复(建议)
为了从根源避免重复,给JobInfos表的WorkOrder字段添加唯一约束:
- 用EF实体配置的方式:
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<JobInfo>() .HasIndex(j => j.WorkOrder) .IsUnique(); } - 或者直接在SQL Server中执行SQL语句:
CREATE UNIQUE INDEX IX_JobInfos_WorkOrder ON JobInfos(WorkOrder);
内容的提问来源于stack exchange,提问作者thisismyspamstuff
相关产品推荐
相关产品推荐

