如何在不使用循环的情况下从VB.NET 2008数据表中删除多行?
- 我不想从数据库中删除。
- 我想从本地数据表中删除。
- 我知道
Select
方法以及Remove
和remove at方法。但是这需要循环来从数据表中删除行。
我有40000行数据,我想从其中选择1000行进行删除。
如何在不使用循环的情况下从VB.NET 2008数据表中删除多行?
Select
方法以及Remove
和remove at方法。但是这需要循环来从数据表中删除行。我有40000行数据,我想从其中选择1000行进行删除。
我不知道这是否可以直接完成。datatable上没有一个删除命令可以做到这一点。
你可以尝试类似于这样的方法。将你想要保留的记录选择到一个临时表中,清空原始表,然后将临时表合并回原始表中。
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行的情况,它可能已经足够了。
dt.Rows.RemoveAt(0)
dt.Rows.RemoveAt(1)
在 ADO.NET 命令对象中使用 SQL 语句。显然,您想要删除的行将具有共同点。
Delete From MyTable where mycolumn='XYZ' and thisColumn='ABC'
我不确定这是否正式地被认为是使用循环,但这里有一个使用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();
Clear
方法。如果您正在使用LINQ to SQL,则可以调用DeleteAllOnSubmit()。但是,这将为每个要删除的实体提交一个DELETE语句,效率非常低下。您可以始终fork LINQ to SQL或使用存储过程。
顺便说一句,您的问题非常通用。我的第一反应是建议使用WHERE子句。
也许使用DataView会有奇效。例如,您可以将要保留的行过滤到DataView中,将视图转换为表格并处理初始表格。然后,您就拥有了所需的带有行的表格。
Dim view As DataView = YourTable.DefaultView
view.RowFilter = "YourFilterColumn = 1259"
Dim tblNew as Datatable = view.ToTable
YourTable.Dispose
如果这对你有用,请告诉我。
我认为你应该使用LINQ。你可以从数据集中获取datatable,并编写一个LINQ查询来删除符合条件的行。
所以你不需要循环。
这里有一些链接可能会对你有帮助。
谢谢Bremer,这是最优的代码用于在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")