避免DataTable查询和构建中的重复

Posted

技术标签:

【中文标题】避免DataTable查询和构建中的重复【英文标题】:Avoid duplication in DataTable query and build 【发布时间】:2016-04-04 05:54:37 【问题描述】:

在查询数据表然后将其保存到数据表时,避免重复的正确方法是什么。我正在使用下面的模式,一旦表格增长,它就很容易出错。我看了下面的提示。第一个 copyToDataTable() 看起来不太适用,第二个对我来说太复杂了。我想将以下代码拆分为 2 个单独的方法(第一个用于构建查询,第二个用于检索 DataTable)。也许如果我在查询中避免使用匿名类型,这应该更容易避免对所有列名进行硬编码 - 但我不知何故迷失了这一点。

Filling a DataSet or DataTable from a LINQ query result set 要么 https://msdn.microsoft.com/en-us/library/bb669096%28v=vs.110%29.aspx

public DataTable retrieveReadyReadingDataTable()
        
        DataTable dtblReadyToSaveToDb = RetrieveDataTableExConstraints();
        var query = from scr in scrTable.AsEnumerable()
                    from products in productsTable.AsEnumerable()
                    where(scr.Field<string>("EAN") == products.Field<string>("EAN"))
                    select

                    new
                    
                        Date = DateTime.Today.Date,
                        ProductId = products.Field<string>("SkuCode"),
                        Distributor = scr.Field<string>("Distributor"),
                        Price = float.Parse(scr.Field<string>("Price")),
                        Url = scr.Field<string>("Url")
                    ;


        foreach (var q in query)
        
            DataRow newRow = dtblReadyToSaveToDb.Rows.Add();

            newRow.SetField("Date", q.Date);
            newRow.SetField("ProductId", q.ProductId);
            newRow.SetField("Distributor", q.Distributor);
            newRow.SetField("Price", q.Price);
            newRow.SetField("Url", q.Url);
        

        return dtblReadyToSaveToDb;
    

【问题讨论】:

请分享RetrieveDataTableExConstraints()的实现 这只是使用 DataTable retrieveReady.... = reader.GetSchemaTable(); 从 SQL 服务器中检索 DataTable 的架构。 + 一些小的调整以删除 PK、允许空值等。 您的真正问题是什么? “避免重复”是什么意思? 嗨伊万。我在下面对 ViRuSTriNiTy 的评论中说明了这一点。对我来说,重复之处在于我硬编码匿名类型中的名称并将它们再次硬编码为 DataRows 的名称,而这些名称在我检索 DataTable 时已经设置。任何时候都有变化,这需要在很多地方进行更改。 【参考方案1】:

首先,您必须确定“重复”在您的情况下的含义。根据您的代码,我会说重复是在 Date、ProductId 和 Distributor 列中具有相同值的行。所以首先为这些列添加一个多列主键。

其次,您应该添加某种代码,首先查询现有行,然后将这些现有行与您要创建的行进行比较。如果找到匹配项,则只需不插入新行即可。

【讨论】:

嗯,这并不能告诉我太多:(对我来说,重复的是我设置了行的名称,当我在第二次这样做时已经这样做了。创建匿名类型第三次。这些也已经在代码开头启动的检索到的 TataDable 中可用。 实际上第四次,作为 q 的属性,幸运的是这些是智能感知的

以上是关于避免DataTable查询和构建中的重复的主要内容,如果未能解决你的问题,请参考以下文章

去除DataTable重复数据的三种方法

Datatable 正在从我为 Windows 10 构建的 VB.NET 应用程序中的 SQL 查询结果中接收 (01\dd\yyyy) 格式的日期

怎么去除datatable 中一列的重复值【急】

JOINing多对多表时避免SQL查询中的重复行

避免用于派生选择中的列的多个重复子查询

如何构建数据库以避免表中的重复