如何根据条件从数据表中删除特定行值

时间:2010-08-03 12:59:54

标签: c#

我有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

我怎样才能获得这个结果?

4 个答案:

答案 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)

一种方法是:

  1. 创建表达式以匹配行;即“name ='manu'或name ='tom'OR name ='anu'”
  2. 对原始数据表执行表达式以选择要删除的行。
  3. 循环并删除所有匹配的行。
  4. 假设: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);
         }
    }
}

这是一种非常简单的方法,可以让您完成所需的工作。