Select New
без указания имени класса в качестве результата запроса будет возвращать анонимный тип (например, IEnumerable(Of AnonymousType)
) и CopyToDataTable()
исключение, поскольку IEnumerable(Of AnonymousType)
не может быть преобразовано непосредственно в IEnumerable(Of DataRow)
.
Следовательно, вам необходимо преобразовать анонимный тип в DataRow
, используя дополнительный метод Select
, который перебирает содержимое IEnumerable(Of AnonymousType)
и возвращает DataRow
с DataTable.NewRow()
(используя подготовленный DataTable
, который включает имена столбцов как результирующий набор):
' joined DataTable columns
Dim JoinedDT As New DataTable
JoinedDT.Columns.Add("ID", GetType(Integer))
JoinedDT.Columns.Add("Name", GetType(String))
JoinedDT.Columns.Add("YearOfBirth", GetType(Integer))
' other stuff
Dim query As IEnumerable(Of DataRow) = (From dr1 In Dt1.AsEnumerable() _
Group Join dr2 In Dt2.AsEnumerable() _
On dr1.Field(Of Integer)("ID") Equals dr2.Field(Of Integer)("ID") _
Into joined = Group _
From j In joined.DefaultIfEmpty() _
Select New With
{
.ID = dr1.Field(Of Integer)("ID"),
.Name = dr1.Field(Of String)("Name"),
.YearOfBirth = If(j IsNot Nothing, j.Field(Of Integer)("YearOfBirth"), 0)
}).Select(Function(r)
' use `DataTable.NewRow` here
Dim row As DataRow = JoinedDT.NewRow()
row("ID") = r.ID
row("Name") = r.Name
row("YearOfBirth") = r.YearOfBirth
Return row
End Function)
Dt3 = query.CopyToDataTable()
Справка:
Получить linq для возврата IEnumerable результат (версия C #)