web-dev-qa-db-ja.com

LINQを使用してDataTableから行を削除する方法は?

DataTableから行を削除する次のコードがあります。

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

上記のコードは正常に動作します。方法convertこのコードを[〜#〜] linq [〜#〜]

15
Samiey Mehdi

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();
30

拡張メソッドでこのインラインラムダコードを試してください:

dTable.AsEnumerable().Where(r => r.Field<string>("col1") == "ALi").ToList().ForEach(row => row.Delete());
8

forループまたはwhileループを使用して行を削除するが、foreachは削除しない

以下は非LINQソリューションです

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

LINQ

dTable = dTable.AsEnumerable().Where(r => r.Field<string>("col1") != "ALi").CopyToDataTable();
2
Damith

私はこれに対する解決策を広範囲にわたって検索し(4回以上のGoogle検索)、最終的にLINQが削除を行わないことを最終的に収集しました(Sergey Berezovskiyの投稿で)-したがって、LINQを使用して行を選択します使用中のデータベーステクノロジーの「通常の」メカニズムを介してそれらを削除して削除したい。 LINQについてのデータベースにとらわれないプロパガンダをすべて非常にばかげているように思えますか?

これは機能しますが、もう少し実験すれば、2つの「For Each」ループを1つに減らすことができます。

特定のObjectType(1番目のキーフィールド)に対して選択したプロパティ名(3番目のキーフィールド)を持つすべてのエントリを削除したいプロパティのテーブルがあり、これを思いつきました。

参考までに、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
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);
}
0
Suraj Singh

これを試して

DataRow[] rows;
rows=dataTable.Select("UserName = 'ABC'"); // UserName is Column Name
foreach(DataRow r in rows)
r.Delete();
0
Golda