Как удалить несколько строк из datatable в VB.NET 2008?

Как удалить несколько строк из datatable в VB.NET 2008 без цикла?

  • Я не хочу удалять из базы данных.
  • Я хочу удалить из локальной таблицы данных.
  • Я знаю Select метод, а также Remove и удалить метод at тоже. Но для этого необходимо выполнить цикл, чтобы удалить строки из таблицы данных.

у меня есть 40000 строк, и я хочу удалить выбранные 1000 строк из этой таблицы данных.

10 ответов


Я не знаю, что это можно сделать простым способом. В datatable нет команды delete, которая сделает это.

вы можете попробовать что-то вроде этого. Вы выбираете записи, которые хотите сохранить во временной таблице, очищаете исходную таблицу, а затем объединяете временную таблицу обратно в исходную.

Dim dtTemp As DataTable = ds.Tables("YourTable").Select("RecordsToKeep='This'").CopyToDataTable
ds.Tables("YourTable").Clear()
ds.Tables("YourTable").Merge(dtTemp)
dtTemp.Dispose()

Это лучший ответ на вопрос, который я могу придумать. Похоже, вы можете использовать datatable необычным образом. Ты вообще лучший не заполнять записи для начала или фильтровать их при сохранении содержимого в пункт назначения. Будь то XML-файл, SQL или что-то еще.

конечно, метод цикла будет наиболее эффективным. Это, вероятно, не самый быстрый метод, но только для 4K строк, это, вероятно, достаточно хорошо.


Если вы хотите удалить все строки, вы можете использовать Clear метод на datatable.


dt.Rows.RemoveAt(0)
dt.Rows.RemoveAt(1)

может быть, использовать DataView сделает трюк. Например, можно отфильтровать строки, которые необходимо сохранить в DataView, преобразовать представление в таблицу и удалить исходную таблицу. Затем у вас есть таблица со строками, которые вам нужны.

Dim view As DataView = YourTable.DefaultView            
view.RowFilter = "YourFilterColumn = 1259"
Dim tblNew as Datatable = view.ToTable
YourTable.Dispose

Дайте мне знать, если это работает для вас.


Я не уверен, что это будет официально квалифицироваться как использование цикла, но вот решение с использованием LINQ:

dt.BeginLoadData();
( from row in dt.AsEnumerable()
  where row.Field<string>( "MyColumn"  ) == "DeleteValue"
  select row ).ToList().ForEach( row => row.Delete() );
dt.EndLoadData();
dt.AcceptChanges();

TBH, я не уверен, что есть способ сделать это без цикла через строки на некотором уровне. Либо вы перебираете строки, удаляя те, которые вам не нужны, либо создаете новую таблицу, заполненную всем, кроме строк, которые вам не нужны. Однако следует отметить, что даже в более позднем случае NET, вероятно, зацикливается на строках, чтобы определить, должна ли строка быть включенным в таблицу keeper.


Я думаю, вы должны использовать LINQ для этого. Вы получите datatable из dataset и напишите запрос LINQ для удаления строки, соответствующей вашим критериям.

Так что вам не нужно цикл для этого.

вот некоторые ссылки, которые могут помочь вам.


используйте инструкцию SQL в ADO.NET объект команды. Очевидно, что строки, которые вы хотите удалить, будут иметь что-то общее.

Delete From MyTable where mycolumn='XYZ' and thisColumn='ABC'

можно назвать DeleteAllOnSubmit() Если вы используете LINQ to SQL. Однако это отправит инструкцию DELETE для каждого удаляемого объекта, что крайне неэффективно. Вы всегда можете fork LINQ to SQL или используйте хранимую процедуру.

кстати, вы вопрос очень общий. Моей первой склонностью было рекомендовать использовать предложение WHERE.


мы всегда можем написать хранимую процедуру для оптимизации ADO.NET entity-framework или LINQ to SQL roundtrips в некоторых случаях. Недостатком является то, что модель начинает выглядеть немного unconsistent. Мне тоже интересно, есть ли лучший способ:)


спасибо Бремер, это оптимальный код для удаления строк в datatable, для меня это быстрый метод:

Public Sub BorrarFilasEnDatatable(ByRef dtDatos As DataTable, ByVal strWhere As String)
        Dim dtTemp As New DataTable
        Dim filas As DataRow()
        filas = dtDatos.Select("NOT(" & strWhere & ")")
        dtDatos.Clear()
        If filas.Count > 0 Then
            dtTemp = filas.CopyToDataTable
            dtDatos.Merge(dtTemp)
        End If
        dtTemp.Dispose()
End Sub

'call me method for delete rows
Me.BorrarFilasEnDatatable(dt1, "Id<10")