如何使用VB.Net将Dataset与List(Of Int64)对比并筛选数据
需求说明
我正在开发一个应用,需要将API返回的整数列表与包含对应Id的Dataset进行对比,筛选出Dataset中存在于该列表内的Id对应的记录。例如,若API响应包含Id 1和2,则需移除除这两个Id对应的位置外的所有其他位置。
现有代码
调用API与获取Dataset的代码
Dim response = Await mKubotaInvoiceHistoryApi.GetKubotaInvoiceLocationIdentitiesAsync() mLocations = UIC.Cache.GetSimpleLocation()
API方法定义
Public Async Function GetKubotaInvoiceLocationIdentitiesAsync() As Task(Of List(Of Int64)) Dim response = Await sendGetAsync(Of List(Of Int64))( "api/partners/kubota/kubotainvoicehistory") Return response End Function
Dataset结构说明
mLocations 是一个Dataset,内部包含的表带有LocationId字段(即需要与API返回列表匹配的Id字段),以及其他描述位置的相关字段。
筛选实现方案
方法1:利用DataTable原生Select方法
通过生成IN筛选条件,直接从DataTable中筛选符合条件的行,再构建新的DataTable替换原Dataset中的表:
' 指定Dataset中的目标数据表(可根据实际表名调整,比如mLocations.Tables("LocationTable")) Dim targetTable = mLocations.Tables(0) ' 生成筛选条件字符串:LocationId IN (id1,id2,...) Dim filterCondition = $"LocationId IN ({String.Join(",", response)})" ' 获取符合条件的数据行 Dim matchedRows = targetTable.Select(filterCondition) ' 复制表结构并导入筛选后的行 Dim filteredTable = targetTable.Clone() For Each row In matchedRows filteredTable.ImportRow(row) Next ' 更新Dataset中的表 mLocations.Tables.Remove(targetTable) mLocations.Tables.Add(filteredTable)
方法2:使用LINQ查询筛选
借助LINQ语法实现更灵活的筛选逻辑,需要引用System.Data.DataExtensions:
Imports System.Data.DataExtensions ' 获取目标数据表 Dim targetTable = mLocations.Tables(0) ' 筛选出LocationId在API返回列表中的行 Dim filteredRows = From row In targetTable.AsEnumerable() Where response.Contains(row.Field(Of Int64)("LocationId")) Select row ' 构建筛选后的新表 Dim filteredTable = targetTable.Clone() filteredRows.CopyToDataTable(filteredTable, LoadOption.OverwriteChanges) ' 更新Dataset mLocations.Tables.Remove(targetTable) mLocations.Tables.Add(filteredTable)
注意:如果API返回的
response为空列表,上述代码会清空Dataset中的对应表,可根据业务需求添加空值判断逻辑。
内容的提问来源于stack exchange,提问作者Kamran Khan
相关产品推荐
相关产品推荐

