我有两个数据表:allRows
和rowsToDelete
。我想从allRows
包含的rowsToDelete
中删除行。这两个表具有相同的结构(相同的列和它们的数据类型),但是我不知道确切的列名甚至数量。
object.Equals()
方法将来自不同表的行识别为不相等,因此我无法使用此方法。
通过谷歌搜索和阅读StackOverflow,我得到一个想法,甚至可以在一行中完成,但是我不知道如何为这种情况建立条件:
allRows = allRows.AsEnumerable().Where(???).CopyToDataTable();
答案 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();
您可以写得更优雅,但它是如此明显