如何避免将CSV文件中的重复数据添加到SQL Server数据库中,使用CSVHelper和C# Blazor

lmyy7pcs  于 2022-11-21  发布在  SQL Server
关注(0)|答案(1)|浏览(216)

我在SQL Server中有一个名为“JobInfos”的数据库表,其中包含许多列。
JobID -(int)在添加数据时自动填充递增值组织代码-(字符串)订单编号-(int)工作单-(int)客户-(字符串)基本模型项目-(字符串)订单数量-(int)承诺日期-(字符串)行类型-(字符串)
使用Blazor应用程序,通过Entity Framework和CSVHelper,一天可以多次写入该表。这非常好用。CSV文件中的所有行都被添加到数据库中。

if (fileExist)
    {
        using (var reader = new StreamReader(@path))
        using (var csv = new CsvReader(reader, config))
        {
            var records = csv.GetRecords<CsvRow>().Select(row => new JobInfo()
                {
                    OrgCode = row.OrgCode,
                    OrderNumber = row.OrderNumber,
                    WorkOrder = row.WorkOrder,
                    Customer = row.Customer,
                    BaseModelItem = row.BaseModelItem,
                    OrdQty = row.OrdQty,
                    PromiseDate = row.PromiseDate,
                    LineType = row.LineType,
                });

        using (var db = new ApplicationDbContext())
        {
           while (!reader.EndOfStream)
               {
                   if (lineNumber != 0)
                   {
                       db.AddRange(records.ToList());
                       db.SaveChanges();
                   }

                   lineNumber++;
               }

               NavigationManager.NavigateTo("/", true);
        }

    }

由于这些多个CSV文件可能包含数据库表中已经存在的行,因此在从表中读取时,我会得到重复的记录,这导致用户手动删除所有较新的重复行,只保留原始条目。
我无法控制CSV文件或其创建。我尝试仅添加包含基于工作单号的新数据的行,该工作单号不能与任何其他工作单号相同。
我在StackOverflow上找到了另一个帖子,这很有帮助,但我被一个我无法解决的剩余错误卡住了。
The Helpful post
我在这里更改了代码...

if (lineNumber != 0)
    {
        var recordworkorder = records.Select(x => x.WorkOrder).ToList();

        var workordersindb = db.JobInfos.Where(x =>  recordworkorder.Contains(x.WorkOrder)).ToList();

        var workordersNotindb = records.Where(x => !workordersindb.Contains(x.WorkOrder));

        db.AddRange(records.ToList(workordersNotindb));

        db.SaveChanges();
}

但这条线...

var workordersNotindb = records.Where(x => !workordersindb.Contains(x.WorkOrder));`

在结束时抛出错误(x.WorkOrder)- CS1503参数1:无法从“int”转换为“DepotQ4.Data.JobInfo”
WorkOrder是一个int JobID是一个int主键表中的每条记录都必须有一个唯一的WorkOrder
我不确定我没有看到什么。这里需要帮助吗?

pbossiut

pbossiut1#

你的变量workordersindbList<JobInfo>。所以当你试图从records.Where(x => !workordersindb.Contains(x.WorkOrder))中选择时,你试图将workordersindb中的JobInfo列表与x.WorkOrder中的int进行匹配。workordersindb需要是List<int>才能与Contains一起使用。records也会有同样的问题,但您通过创建变量recordworkorder并使用records.Select(x => x.WorkOrder)得到List<int>来解决了这个问题。

if (lineNumber != 0)
{
    var recordworkorder = records.Select(x => x.WorkOrder).ToList();

    var workordersindb = db.JobInfos.Where(x =>  recordworkorder.Contains(x.WorkOrder)).Select(x => x.WorkOrder).ToList();

    var workordersNotindb = records.Where(x => !workordersindb.Contains(x.WorkOrder));

    db.JobInfos.AddRange(workordersNotindb);

    db.SaveChanges();
}

相关问题