2

以下は私の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. ループは使いたくない
4

1 に答える 1

3

CopyToDataTable.NET3.5以降はすでに存在しています。DataTableしかし、問題は、匿名タイプから「最初から」作成したいということです。それはうまくいきません。

CopyToDataTableのみの拡張子ですIEnumerable<DataRow>。したがって、参加しているものから1つ を選択する必要があります。DataRowDataTables

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()

または、リフレクションを使用するこれObjectShredderを使用するため、最も効率的な方法ではありません(C#実装)。

これとは別に、なぜあなたは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
于 2013-01-29T08:10:13.030 に答える