【问题标题】:Delete rows in datatable from another datatable从另一个数据表中删除数据表中的行
【发布时间】:2018-07-19 05:14:17
【问题描述】:

我有两个数据表:allRowsrowsToDelete。我想从allRows 中删除rowsToDelete 包含的行。两个表具有相同的结构(相同的列和它们的数据类型),但我不知道确切的列名,甚至它们的数量。

object.Equals() 方法将不同表中的行识别为不相等,因此我不能使用这种方法。

通过谷歌搜索和阅读 StackOverflow,我得到一个想法,它可能甚至可以在一行中完成,但我不知道如何为这种情况建立条件:

allRows = allRows.AsEnumerable().Where(???).CopyToDataTable();

【问题讨论】:

    标签: c# .net datatable


    【解决方案1】:

    我不知道你的数据结构,但一般来说你可以做到

    var cleanedUp = allRows.Where(row => !rowsToDelete.Any(row2 => row2.Id == row.Id ));
    

    【讨论】:

    【解决方案2】:

    如果您没有任何主键,请检查组合(复合键)为您提供唯一性的多个列,您可以代表它们轻松地从 rowsTodelete 表中存在的所有具有相似数据的行中删除行。

    【讨论】:

    • 如果您阅读问题,用户不知道列及其类型
    • 但我认为用户有权通过选择查询从那里访问数据库,他可以轻松访问列名。
    • 我会说这不是解决问题的方法
    • 但在我看来,在这种情况下,如果您从没有任何标识列的单个表中删除数据,那么这是执行此操作的适当方法,那么首先您现在必须至少有列名。如果表存在,那么您很容易使用 select 语句来查找列名不是吗?
    【解决方案3】:

    首先在相似列上的两个表之间实现内部联接,以检索您要删除的数据并将其插入任何临时表并从 allrows 表中删除此数据。

    希望对你有所帮助。

    【讨论】:

      【解决方案4】:

      你的任务没有解决方案,你改变了条件, 你先写:

      两个表具有相同的结构(相同的列和它们的数据类型)

      然后你写:

      这就是问题所在 - 结构可以不同,并且不能有“Id”列

      如果你甚至可以更改数据,你可以减去两个表并调查它们的结构、列等。但你坚持说你不知道它们。

      当你找出结构后,任务就变得很初级了,就像这样(我使用我自己项目中的结构):

      var foo = DbContext
                  .Set<Task>()
                  .Select(x => new{x.Assignee, x.Availability})
                  .ToList();
      
              var foo2 = DbContext
                  .Set<Task2>()
                  .Select(x => x)
                  .ToList();
      
              var bar = foo2.Where(x => foo.Select(y => y.Assignee).Contains(x.Assignee) 
                                        && foo.Select(y => y.Availability).Contains(x.Availability));
      
              DbContext.RemoveRange(bar);
              DbContext.SaveChanges();
      

      你可以写得更优雅,但它是如此明显

      【讨论】:

      • 我的意思是它有时会有所不同,但无论如何这两个表都是一样的
      • 我以为您只是想获得一些选票,而不是解决您的问题。这不是现实生活中的应用程序,您的解决方案证明了这一点:首先-SequenceEqual(如果您不重新定义它们)比较参考,而不是数据(显然,即使数据相等,您也会得到错误),即使它是第二个类型,伙计,真的,你只需把表的结构通过linq内联得到,如果你可以访问DB,你就可以得到表的结构。 ох уж эти братья славяне... какой пассаж.;)
      • 它是从用户的 .dbf 文件中提取数据表的真实应用程序 - 这就是它的结构未知的原因
      • 修复了这个问题
      【解决方案5】:

      此解决方案适用于任何数据结构、任何列的数量和类型。 我们将 DataRows 呈现为数组并比较每个单元格。

      public static void DeleteCopies(DataTable allRows, DataTable rowsToDelete)
          {
              foreach (DataRow rowToDelete in rowsToDelete.Rows)
              {
                  foreach (DataRow row in allRows.Rows)
                  {
                      var rowToDeleteArray = rowToDelete.ItemArray;
                      var rowArray = row.ItemArray;
                      bool equalRows = true;
                      for (int i = 0; i < rowArray.Length; i++)
                      {
                          if (!rowArray[i].Equals(rowToDeleteArray[i]))
                          {
                              equalRows = false;
                          }                            
                      }
                      if (equalRows)
                      {
                          allRows.Rows.Remove(row);
                          break;
                      }
                  }
              }
          }
      

      【讨论】:

        猜你喜欢
        • 2014-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-29
        相关资源
        最近更新 更多