从另一个数据表中删除数据表中的行

时间:2018-07-19 05:14:17

标签: c# .net datatable

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

object.Equals()方法将来自不同表的行识别为不相等,因此我无法使用此方法。

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

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

5 个答案:

答案 0 :(得分:0)

我不知道您的数据结构,但总的来说您可以做到

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

OR

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

希望对您有帮助。

答案 3 :(得分:0)

此解决方案适用于任何数据结构,任何列的编号和类型。 我们将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;
                }
            }
        }
    }

答案 4 :(得分:0)

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

  

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

然后您编写:

  

这就是问题-结构可能不同,并且没有“ 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();

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