首页 文章

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

提问于
浏览
1

我有这样的 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 回答

  • 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的一些讨论,我认为必须有一种方法来使用's easy to read and apply. Previously, it didn'工作的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

    一种方法是:

    • 创建表达式以匹配行;即"name='manu' OR name='tom' OR name='anu'"

    • 对原始数据表执行表达式以选择要删除的行 .

    • 循环并删除所有匹配的行 .

    假设: 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();
    }
    
  • 0

    为什么不进行简单的查询:DELETE FROM table1 WHERE table1.name IN(SELECT name FROM table2)

  • 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);
             }
        }
    }
    

    这是一个非常简单的方法来获得你需要做的事情 .

相关问题