【问题标题】:vb.net Linq select from enumareablevb.net Linq 从可枚举中选择
【发布时间】:2012-10-15 19:06:48
【问题描述】:

我有以下 LINQ 查询,它将按列分组并将每个组添加到数据集中的数据表中:

Dim ds As New DataSet
Dim query = From r In bookedorders Group By key = r.Field(Of Integer)("productgroup") Into Group
For Each grp In query
    Dim x As New DataTable
    x = grp.Group.CopyToDataTable()
    ds.Tables.Add(x)
Next

如何在此查询中从表 bookedorders 中选择特定列,然后再将它们添加到 DataTable? 我有 18 列,我只想在结果 DataTable 中显示 4。

【问题讨论】:

  • 您只能通过CopyToDataTableIEnumerable(Of DataRow) 创建一个DataTable。如果您通过匿名类型仅选择几列,则无法再从中创建DataTable
  • @TimSchmelter 我现在正在做的是在循环中使用 datatable.columns.remove,但我想如果我要删除它们,我为什么要添加列!这是一个愚蠢的解决方案,但我厌倦了寻找解决方案!
  • 最终,您为什么需要将其推送到数据表中?为什么不只使用类/匿名类型进行投影?除非你真的需要在代码中下线,否则 DataTables 似乎有点过头了。
  • @JimWooley:如果他需要从方法中返回表,他不能使用匿名类型,并且与List(Of Foo) 没有太大区别。
  • @JimWooley 我正在使用第三方库来打印表格,它要求我返回要在数据集中打印的表格

标签: vb.net linq datatable


【解决方案1】:

您只能通过CopyToDataTableIEnumerable(Of DataRow) 创建一个DataTable。如果您通过匿名类型仅选择几列,则无法再从中创建DataTable

因此,您需要先使用要选择的列创建另一个 DataTable。

例如:

Dim table2 = New DataTable()
table2.Columns.Add("Column1")
table2.Columns.Add("Column2")
Dim query = From r In bookedorders 
            Group By key = r.Field(Of Integer)("productgroup") Into Group

Dim ds As New DataSet
For Each grp In query
    Dim tbl = table2.Clone()
    ds.Tables.Add(tbl)
    For Each row As DataRow In grp.Group
        Dim newRow = tbl.Rows.Add()
        newRow.SetField("Column1", row.Field(Of String)("Column1"))
        newRow.SetField("Column2", row.Field(Of String)("Column2"))
    Next
Next

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多