我有DataTable
这样的
name age ------------ kumar 27 kiran 29 anu 24 peter 34 tom 26 manu 35 sachin 37 geetha 23
现在我有另一个DataTable
这样的一列:
name ---- manu tom anu
我需要在此处比较 name 列中的值,并删除所有共享相同名称的行。现在结果输出应该是这样的:
name age ------------ kumar 27 kiran 29 peter 34 sachin 37 geetha 23
我怎样才能获得这个结果?
答案 0 :(得分:1)
假设您的意思是.NET datatables而不是SQL表。一种方法如下。将您的第二个数据表转换为字典,如下所示:
// create a lookup table to ease the process
Dictionary<string, string> dict = (from row in removeNames.AsEnumerable()
select (string) row["name"])
.ToDictionary(k => k);
你必须从头到尾循环,否则你会遇到问题(这里不能使用foreach
,它会抛出异常)。
// loop top to bottom
for(var i = firstDT.Rows.Count - 1; i >= 0; i--)
{
var row = firstDT.Rows[i];
if(dict.Exists((string) row["name"]))
{
firstDT.Remove(row);
}
}
部分灵感来自下面与Jerod的一些讨论,我认为必须有一种方法来使用易于阅读和应用的LINQ表达式。以前,它不起作用,因为我枚举了DataRowView本身,当你尝试删除某些内容时,会引发InvalidOperationException
,告诉你该集合已被修改。这是我做的,它的工作原理是因为我们使用Select
来创建行项的副本:
// TESTED, WORKS
// assuming table contains {name, age} and removeNames contains {name}
// selecting everything that must be removed
var toBeRemoved = from row in table.Select()
join remove in removeNames.AsEnumerable()
on row["name"] equals remove["name"]
select row;
// marking the rows as deleted, this will not raise an InvalidOperationException
foreach (var row in toBeRemoved)
row.Delete();
答案 1 :(得分:1)
一种方法是:
假设:table
=原始数据表,table2
=过滤数据表。
string expression = string.Join( " OR ", table2.AsEnumerable().Select(
row => string.Format( "name='{0}'", row["name"] )).ToArray() );
foreach( DataRow row in table.Select( expression ) )
{
row.Delete();
}
答案 2 :(得分:0)
为什么不进行简单的查询: DELETE FROM table1 WHERE table1.name IN(SELECT name FROM table2)
答案 3 :(得分:0)
如果您知道要从中删除的表格可以执行此类操作。
foreach(DataRow rowTable2 in dataSet.Tables["Table2"].Rows)
{
foreach(DataRow rowTable1 in dataSet.Tables["Table1"].Rows)
{
if(rowTable1["NameColumn"].ToString() == rowTable2["NameColumn"].ToString())
{
dataSet.Tables["Table1"].Rows.Remove(rowTable1);
}
}
}
这是一种非常简单的方法,可以让您完成所需的工作。