Как удалить строки из DataTable с помощью LINQ?

У меня есть следующий код для удаления строк из DataTable:

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

выше код работает нормально. как преобразовать этот код в LINQ?

Ответ 1

LINQ не для удаления или изменения - это для запросов. С помощью LINQ вы можете выбрать данные, которые следует удалить, а затем удалить эти данные вручную (например, в цикле foreach или с расширением списка ForEach):

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

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

UPDATE: также с помощью LINQ to DataSet вы можете выбрать все строки, которые должны оставаться в таблице, и создать новый DataTable из этих строк:

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

Ответ 2

Попробуйте этот встроенный лямбда-код с помощью методов расширения:

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

Ответ 3

вы используете цикл loop или while для удаления строк, но не foreach

ниже - это не linq-решение

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

LINQ

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

Ответ 4

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

Ответ 5

Попробуйте это

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

Ответ 6

Я искал далеко и широко (ну, более четырех поисков Google) для решения этого вопроса, и в конце концов я в конце концов почерпнул (выше в сообщении Сергея Березовского), что LINQ не делает удаления - поэтому вы используете LINQ для выбора строки, из которых вы хотите избавиться, и удалить их через "обычный" механизм используемой технологии базы данных. Кажется, сделать всю эту агрономическую пропаганду базы данных о LINQ довольно глупым?

Это работает, хотя с небольшим количеством экспериментов можно было бы уменьшить два цикла "Для каждого" до одного.

У меня была таблица свойств, где я хотел удалить все записи с выбранным именем свойства (3-е ключевое поле) для определенного объекта ObjectType (1st Keyfield), и я придумал это.

FYI объект 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

Ответ 7

dTable.Rows.Remove(dTable.AsEnumerable().Where(r => r.Field<string>("col1") == "Ali").FirstOrDefault());