webentwicklung-frage-antwort-db.com.de

Wie lösche ich Zeilen aus DataTable mit LINQ?

Ich habe folgenden Code zum Löschen von Zeilen aus DataTable: 

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

der Code funktioniert gut. wie konvertieren diesen Code in LINQ?

14
Samiey Mehdi

LINQ dient nicht zum Löschen oder Ändern - es ist für Abfragen von - Daten. Mit LINQ können Sie Daten auswählen, die gelöscht werden sollen, und diese Daten dann manuell löschen (z. B. in der foreach-Schleife oder mit der ForEach-Listenerweiterung):

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

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

UPDATE: Auch mit LINQ to DataSet können Sie alle Zeilen auswählen, die in der Tabelle bleiben sollen, und aus diesen Zeilen eine neue DataTable erstellen:

var table = dTable.AsEnumerable()
                  .Where(r => r.Field<string>("col1") != "ALi")
                  .CopyToDataTable();
27

Versuchen Sie diesen Inline-Lambda-Code mit Erweiterungsmethoden: 

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

sie verwenden for-Schleife oder while-Schleife, um Zeilen zu löschen, aber nicht foreach

unten ist nicht linq lösung

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

LINQ

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

Ich habe weit und breit (mehr als vier Google-Suchen) nach einer Lösung dafür gesucht und am Ende habe ich schließlich (oben in Sergey Berezovskys Post) herausgefunden, dass LINQ nicht löscht - also verwenden Sie LINQ, um die Zeilen auszuwählen, die Sie auswählen Sie wollen sie durch den "üblichen" Mechanismus der verwendeten Datenbanktechnologie beseitigen und löschen. Scheint alle diese Datenbank-agnostische Propaganda über LINQ ziemlich dumm zu machen?

Dies funktioniert zwar, aber mit etwas mehr Experimentieren kann man die beiden 'For Each'-Schleifen auf eine reduzieren.

Ich hatte eine Tabelle mit Eigenschaften, in der ich alle Einträge mit einem ausgewählten Eigenschaftennamen (3. Schlüsselfeld) für einen bestimmten ObjectType (1. Schlüsselfeld) löschen wollte, und ich kam dazu.

Zu Ihrer Information, das REPLY-Objekt ist ein bisschen wie das Error-Objekt - Ich packe nur Fehlermeldungen, ein binäres Pass/Fail-Flag und ein paar andere Dinge, damit ich Lasten aus einer Abfrage zurückgeben kann und (möglicherweise) den Fehler dem Benutzer anzeigen kann .

  ' <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

Versuche dies

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