无法将LINQ结果复制到datatable中

时间:2013-01-29 08:06:05

标签: .net vb.net linq

以下是我的LINQ查询:

Dim JoinedResult = From t1 In temp.AsEnumerable() _
                   Group Join t2 In tbCity.AsEnumerable() _
                   On t1.Field(Of String)("City") Equals t2.Field(Of String)("city_name") _
                   Into RightTableResults = Group _
                   From t In RightTableResults.DefaultIfEmpty
                   Select New With 
                   {
                        .ID = t1.Item("ID"), 
                        .CID = If(t Is Nothing, 
                        1,  
                        t.Item("city_gid"))
                   }  

如何将值从“JoinedResult”复制到数据表?

注意:

  1. 我没有得到JoinedResult.CopyToDataTable()
  2. 我不想使用循环

1 个答案:

答案 0 :(得分:3)

自.NET 3.5起,

CopyToDataTable已经存在。但问题是你想从匿名类型创建一个DataTable“从头开始”。这不起作用。

CopyToDataTable仅是IEnumerable<DataRow>的扩展名。因此,您必须从加入的DataRow中选择一个 DataTables

Dim query =  From t1 In temp.AsEnumerable() _
             Group Join t2 In tbCity.AsEnumerable() _
             On t1.Field(Of String)("City") Equals t2.Field(Of String)("city_name") Into RightTableResults = Group 
             From t In RightTableResults.DefaultIfEmpty
             Select t1
Dim table = query.CopyToDataTable()

或使用使用反射的this ObjectShredder,因此不是最有效的方式(C# implementation)。

除此之外,你为什么还需要DataTable?您还可以将匿名类型用作DataSource,或者创建一个可以从查询结果初始化的自定义类。

修改:您还可以创建包含所需列的自定义DataTable,例如(来自您的评论):

Dim tbTemp As New DataTable
tbTemp.Columns.Add("ID")
tbTemp.Columns.Add("CID")

Dim query = From t1 In temp.AsEnumerable()
            Group Join t2 In tbCity.AsEnumerable() On
            t1.Field(Of String)("City") Equals t2.Field(Of String)("city_name")
            Into RightTableResults = Group
            From t In RightTableResults.DefaultIfEmpty
            Select New With {.ID = t1.Item("ID"), .City_Gid = t.Item("city_gid")}
For Each x In query
    tbTemp.Rows.Add(x.ID, x.City_Gid)
Next