19

我有以下代码从 DataTable 中删除行:

var rows = dTable.Select("col1 ='ali'");
foreach (var row in rows)
   row.Delete();

上面的代码工作正常。如何将此代码转换为LINQ

4

7 回答 7

39

LINQ 不是用于删除或修改 - 它是用于查询数据。使用 LINQ,您可以选择应该删除的数据,然后手动删除这些数据(例如在 foreach 循环中或使用 ForEach 列表扩展名):

var query = dTable.AsEnumerable().Where(r => r.Field<string>("col1") == "ali");

foreach(var row in query.ToList())
   row.Delete();

更新:同样使用 LINQ to DataSet,您可以选择应该保留在表中的所有行并从这些行创建新的 DataTable:

var table = dTable.AsEnumerable()
                  .Where(r => r.Field<string>("col1") != "ali")
                  .CopyToDataTable();
于 2013-09-17T15:54:08.030 回答
11

试试这个带有扩展方法的内联 lambda 代码:

  dTable.AsEnumerable().Where(r => r.Field("col1") == "ali").ToList().ForEach(row => row.Delete());
  dTable.AcceptChanges();
于 2013-09-17T16:28:58.490 回答
2

您使用 for 循环或 while 循环来删除行但不是 foreach

以下是非 linq 解决方案

dTable= dTable.Select("col1 <> 'ali'").CopyToDataTable();

LINQ

dTable = dTable.AsEnumerable().Where(r => r.Field<string>("col1") != "ali").CopyToDataTable();
于 2013-09-17T15:59:38.827 回答
0

Try this

DataRow[] rows;
rows=dataTable.Select("UserName = 'ABC'"); // UserName is Column Name
foreach(DataRow r in rows)
r.Delete();
于 2014-01-24T10:33:38.843 回答
0
var results = from row in dTable.Tables["tablename"].AsEnumerable()
          where row.Field<string>("Col1") == "ali" 
          select row;
foreach (DataRow row in results)
{
   dTable.Tables["tablename"].Remove(row);
}
于 2013-09-17T15:58:20.003 回答
0

我搜索了很多(好吧,超过四个谷歌搜索)以寻找解决方案,最后我最终收集到(在 Sergey Berezovskiy 的帖子中)LINQ 不会删除 - 所以你使用 LINQ 来选择你的行希望通过正在使用的数据库技术的“常规”机制摆脱和删除它们。似乎让所有关于 LINQ 的与数据库无关的宣传变得非常愚蠢?

这确实有效,尽管通过更多的实验可以将两个“For Each”循环减少到一个。

我有一个属性表,我想在其中删除具有特定 ObjectType(第一个键域)的选定属性名称(第三个键域)的所有条目,我想出了这个。

仅供参考,REPLY 对象有点像 Error 对象——我只是打包错误消息、二进制 Pass/fail 标志和其他一些东西,这样我就可以从查询中传回大量内容并(最终)向用户显示错误.

  ' <summary>
  ' The user has decided they don't want a particular property type so we delete all
  ' properties of that type in the table - belonging to any object of that ObjectType
  ' </summary>
  ' <param name="sObjectType"></param>
  ' <param name="sName"></param>
  ' <returns></returns>
  ' <remarks></remarks>
  Public Function DeleteAllPropsByName(sObjectType As String, sName As String) As Reply

    ' Default answer is 'OK'
    DeleteAllPropsByName = New Reply(True)

    Dim T As DataTable = mDB.DataTableImage(msTableName)
    Dim q = From rw In T.AsEnumerable
            Where rw.Field(Of String)("ObjectType") = sObjectType _
            And rw.Field(Of String)("PropName") = sName

    ' Somewhere to remember our list of target rows to delete
    Dim rows As New List(Of DataRow)

    For Each row In q
      '
      ' LINQ doesn't delete so we need to delete from the Datatable directly.
      ' If we delete here we get the collection modified error so we have to save 
      ' the datarows to ANOTHER list and then delete them from there.
      rows.Add(row)

    Next

    For Each rw As DataRow In rows
      '
      ' Call the Delete routine in my table class passing it the 
      ' primary key of the row to delete
      '
      DeleteAllPropsByName = gDB.Table(msTableName).Delete( _
                                  rw.Item("ObjectType").ToString, _
                                  CInt(rw.Item("ObjectID")), _
                                  rw.Item("PropName").ToString)

      If Not DeleteAllPropsByName.OK Then
        ' The reply object (in DeleteAllPropsByName) has all the error info so we can just
        ' exit and return it if the delete failed.
        Exit Function
      End If

    Next

  End Function
于 2018-01-09T02:44:38.280 回答
-1
dTable.Rows.Remove(dTable.AsEnumerable().Where(r => r.Field<string>("col1") == "Ali").FirstOrDefault());
于 2015-10-15T07:45:14.813 回答