VB.Net Linq-to-datatable如何基于具有过滤器的现有数据创建数据表

时间:2014-11-18 20:12:32

标签: vb.net

我有类似的问题,如此链接,

Search DataTable with values from another table

蒂姆已经回答了这个问题。

  Dim strings = From row In PlTable Select row.Field(Of String)(0)
  Dim found = From row In table.AsEnumerable
  Where strings.Any(Function(s) row.Field(Of String)("Name").Contains(s))
      Select row
  Return found.CopyToDataTable()

由于我是新手,所以请帮忙。在我的P1Table中,只有一列有许多值。这些代码是否为P1Table的每个值返回一个新的数据表?此外,在我的P1Table中,ePlTable列的字符串值仅匹配表中列的前3个字符。这些代码仍然有用吗?最后一个问题,当我调试它时,它会显示参数" s"在函数只有一个字符?为什么?感谢

1 个答案:

答案 0 :(得分:0)

根据您在评论中所写的内容,虽然我很困惑为什么您会这样想,并认为您应该更多地查看您的代码,看看是否更好/ neater解决方案(例如,使用DataViews that automatically allow for filtering)。

我这样做的方式如下:

Dim ReturnedTables As New List(Of DataTable)
Dim strings = From row In PlTable Select row.Field(Of String)(0)

For Each s As String In strings
    Dim Retval = From row In table.AsEnumerable
                 Where row.Field(Of String)("Name").Contains(s)
                 Select row

    If Retval.Count > 0 Then ReturnedTables.Add(Retval.CopyToDataTable)
Next

这将填充变量ReturnedTables,它将包含您提到的单独的DataTables。

再次注意,这将是非常占用大量内存的,因为您实际上为循环的每次迭代创建了一个单独的数据表(而不是过滤),但它应该按照您的要求执行。

希望这有帮助!


其他

根据下面的问题,要获取特定数据表中的行数,它看起来会很长:

ReturnedTables(i).Rows.Count

要获取特定字段中的所有值,您将使用与上面使用的完全相同的语法/逻辑来创建strings可枚举。

希望有意义!!