【问题标题】:How to avoid adding duplicate data from CSV file to SQL Server database. Using CSVHelper and C# Blazor如何避免将 CSV 文件中的重复数据添加到 SQL Server 数据库。使用 CSVHelper 和 C# Blazor
【发布时间】:2022-11-14 01:13:55
【问题描述】:

我在 SQL Server 中有一个名为“JobInfos”的数据库表,其中包含许多列。

JobID - (int) 添加数据时自动填充递增值 组织代码 - (字符串) 订单号 - (int) 工单 - (int) 客户 - (字符串) BaseModelItem -(字符串) OrdQty - (int) PromiseDate -(字符串) LineType -(字符串)

使用带有实体框架和 CSVHelper 的 Blazor 应用程序每天多次写入此表。这完美地工作。 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 文件或它们的创建。我正在尝试仅添加包含基于 WorkOrder 编号的新数据的行,该编号不能与任何其他编号相同。

我在 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 是一个整数 JobID 是主键和一个 int 表中的每条记录都必须有一个唯一的 WorkOrder

我不确定我没有看到什么。可以在这里使用一些帮助吗?

【问题讨论】:

    标签: sql-server entity-framework duplicates blazor csvhelper


    【解决方案1】:

    您的变量workordersindbList&lt;JobInfo&gt;。因此,当您尝试从records.Where(x =&gt; !workordersindb.Contains(x.WorkOrder)) 中进行选择时,您是在尝试将workordersindb 中的JobInfo 列表与x.WorkOrderint 匹配。 workordersindb 必须是 List&lt;int&gt; 才能与 Contains 一起使用。 records 会遇到同样的问题,但您通过创建变量 recordworkorder 并使用 records.Select(x =&gt; x.WorkOrder) 获得 List&lt;int&gt; 来解决它。

    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();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-15
      • 2013-09-11
      • 1970-01-01
      • 1970-01-01
      • 2019-03-09
      • 1970-01-01
      相关资源
      最近更新 更多