Невозможно скопировать результат LINQ в datatable

Ниже приведен мой запрос 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"))
                   }  

Как я могу скопировать значения из «Присоединился» к данным?

Заметка:

  1. Я не получаю RegisteredResult.CopyToDataTable()
  2. Я не хочу использовать цикл
2
nl ja de

1 ответы

CopyToDataTable is already there since .NET 3.5. But the problem is that you want to create a DataTable "from the scratch" from an anonymous type. That doesn't work.

CopyToDataTable is an extension for IEnumerable only. So you either have to select one DataRow from your joined 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()

or use this ObjectShredder which uses reflection, hence is not the most efficient way(C# implementation).

Помимо этого, зачем вообще нужен DataTable ? Вы также можете использовать анонимный тип как DataSource или создать собственный класс, который вы можете инициализировать из результата запроса.

Edit: You can also create a custom DataTable with the columns you need, for example(from your comment):

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
3
добавлено
Я не получаю «city_gid» (от t), если я использую select t1. Мне нужно значение t.Item ("city_gid") также
добавлено автор balaji, источник
bcz Мне нужно добавить еще несколько колонок с данными и нужно вставить данные в базу данных (с помощью объемной копии)
добавлено автор balaji, источник
я получил решение, но это может быть глупо или глупо. Dim tbTemp As New DataTable tbTemp.Columns.Add («ID») tbTemp.Columns.Add («CID») Dim РегистрацияResult = От t1 В temp.AsEnumerable() _ Group Join t2 В tbCity.AsEnumerable() _ On t1.Field (Of String) («Город») Equals t2.Field (Of String) («city_name») _ В RightTableResults = Группа _ Из t В RightTableResults.DefaultIfEmpty Выберите tbTemp.LoadDataRow ( Новый объект() {t1.Item ("ID"), t.Item ("city_gid")) datatable = RegisteredResult.CopyToDataTable ()
добавлено автор balaji, источник
добавлено автор balaji, источник
@balaji: Зачем вам нужен DataTable ? Возможно, было бы достаточно использовать IEnumerable в foreach , или вы могли бы создать собственный класс и List . ObjectShredder также работает для любого типа (даже анонимного), но более сложный и не самый эффективный.
добавлено автор Tim Schmelter, источник
@balaji: Затем создайте целевой DataTable со всеми необходимыми столбцами и добавьте строки в foreach из результата запроса.
добавлено автор Tim Schmelter, источник
@balaji: Не совсем, я отредактировал свой ответ, чтобы показать, что я имел в виду.
добавлено автор Tim Schmelter, источник
DotNetRuChat
DotNetRuChat
2 992 участник(ов)

Чат русскоязычного .NET сообщества http://dotnet.ru/ Вам могут быть интересны: @dotnetchat, @cilchat, @fsharp_chat, @pro_net, @xamarin_russia, @microsoftstackjobs, @uwp_ru Флуд в @dotnettalks

Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

pro.net
pro.net
710 участник(ов)

Обсуждение .NET Framework и всего, что с ним связано. Правила: не флудить не по теме, уважать ваших коллег и никакой рекламы (объявления о вакансиях можно согласовать с @AlexFails). Флудилка: @dotnettalks Участник @proDOT

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot

.NET Talks: Force Push Masters
.NET Talks: Force Push Masters
490 участник(ов)

Свободный чат .NET разработчиков. Правила: t.me/dotnettalks/56823 Вам могут быть интересны: @dotnetruchat, @dotnetchat, @cilchat, @fsharp_chat, @pro_net, @dotnetgroup, @xamarin_russia, @microsoftstackjobs, @uwp_ru http://combot.org/chat/-1001128250813

.NET Chat Убежище
.NET Chat Убежище
246 участник(ов)

Чат .NET разработчиков под эгидой MSK/SPB .NET Community Group Вам могут быть интересны: @fsharp_chat, @dotnetruchat, @cilchat, @xamarin_russia, @microsoftstackjobs, @dotnetgroup Флуд в @dotnettalks

.NET CIL Chat
.NET CIL Chat
54 участник(ов)

.NET CIL (aka IL aka MSIL)