VB.net LINQ select 数据表中的特定行

VB.net LINQ select specific rows from datatable

我有这样一种情况,我将所有数据加载到 DataTable 中,但在我的例子中我只需要使用不以前缀(“#”)开头的列。 我可以构建一个函数来遍历数据,但我想使用 LINQ,因为我正在学习它。

我目前拥有的:

Dim l = (From r In (dt.AsEnumerable())
                     From c As DataColumn
                             In r.Table.Columns
                     Where Not c.ColumnName.Contains("#")).ToList()

但是结果不是我需要的。 我知道这个函数有什么问题,但我就是不知道怎么写

为了更清楚:

DataTable:
      [Column1][Column2][Column3]
[Row1]    123      abv   12/10/21
[Row2]    555     sfsf   12/12/21

我不需要 [Column3],并且由于我要做的事情的特殊性,我需要使用完整的 DataTable。因此,结果将是:

DataTable, or List(of) or IEnumerable..:
      [Column1][Column2]
[Row1]    123      abv   
[Row2]    555     sfsf   

而且我希望使用 LINQ,但如果它太复杂或不可能,我将使用正常的 vb 方式。我将构建一个仅包含所需列的新 DataTable...

如果您知道要保留哪些列,则可以执行 Select

dim result = dt.AsEnumerable().[Select](Function(x) New With {
       Key .Col1 = x.Field(Of String)("Column1"),
       Key .Col2 = x.Field(Of String)("Column2")
   }).Tolist()

否则你可以

dim result = dt.AsEnumerable().[Select](Function(x) New With {
       Key .Col1 = x.Field(Of String)("Column1"),
       Key .Col2 = x.Field(Of String)("Column2"),
       'put every field.....
   }).Where(Function(y) Not y.Col3.StartsWith("#"c)).Tolist()

这就是我最终得到的。我只是从集合中删除不需要的列。

dt.Columns.Remove((From c As DataColumn In dt.Columns Where c.ColumnName.StartsWith("#")).First)