Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > LINQ (Language-Integrated Query) > VB.NET и LINQ заполнение таблицы запросом на объед


Автор: swetik1981 7.3.2012, 07:13
Работаю с двумя таблицами: 

Код

' Fill the DataSet. 
Dim ds As New DataSet() 
 ds.Locale = CultureInfo.InvariantCulture 
' See the FillDataSet method in the Loading Data Into a DataSet topic. 
 FillDataSet(ds) 

Dim orders As DataTable = ds.Tables("SalesOrderHeader") 
Dim details As DataTable = ds.Tables("SalesOrderDetail")



 Если составляю на объединение такой запрос(вывод одной из двух объединённых таблиц): 

Код

Dim query = _ 
 From order In orders.AsEnumerable() _ 
 Join detail In details.AsEnumerable() _ 
 On order.Field(Of Integer)("SalesOrderID") Equals _ 
 detail.Field(Of Integer)("SalesOrderID") _ 
 Where order.Field(Of Boolean)("OnlineOrderFlag") = True And _ 
 order.Field(Of DateTime)("OrderDate").Month = 8 _ 
 Select detail


 то заполнение новой таблицы: 
Код

Dim table As DataTable = query.CopyToDataTable()


 происходит в нормальном порядке. 

 Но если запрос такой: 
Код

Dim query = _ 
 From order In orders.AsEnumerable() _ 
 Join detail In details.AsEnumerable() _ 
 On order.Field(Of Integer)("SalesOrderID") Equals _ 
 detail.Field(Of Integer)("SalesOrderID") _ 
 Where order.Field(Of Boolean)("OnlineOrderFlag") = True And _ 
 order.Field(Of DateTime)("OrderDate").Month = 8 _ 
 Select New With _ 
 { _ 
 .SalesOrderID = order.Field(Of Integer)("SalesOrderID"), _ 
 .SalesOrderDetailID = detail.Field(Of Integer)("SalesOrderDetailID"), _ 
 .OrderDate = order.Field(Of DateTime)("OrderDate"), _ 
 .ProductID = detail.Field(Of Integer)("ProductID") _ 
 }


 или даже такой 
Код

Dim query = _ 
 From order In orders.AsEnumerable() _ 
 Join detail In details.AsEnumerable() _ 
 On order.Field(Of Integer)("SalesOrderID") Equals _ 
 detail.Field(Of Integer)("SalesOrderID") _ 
 Where order.Field(Of Boolean)("OnlineOrderFlag") = True And _ 
 order.Field(Of DateTime)("OrderDate").Month = 8 _ 
 Select detail, order 


 то выдает ошибку: 
 "CopyToDataTable" не является членом "System.Collections.Generic.IEnumerable(Of <Анонимный тип>)" 

 Объясните, что делать и как это лечить ?

Автор: Kolovorot 23.10.2012, 10:24
В первом случаи запрос возвращает EnumerableRowCollection<DataRow>.
Во втором случаи EnumerableRowCollection<Анонимный тип>.

Из описания метода CopyToDataTable становится все понятно:
Код

public static DataTable CopyToDataTable<T>(this IEnumerable<T> source) where T : DataRow;


Ну а в третьем случаи ошибка появляется во время написания код. Можно конечно в этом случаи использовать кортежи(Tuple<DataRow,DataRow>). И тогда запрос будет возвращать IEnumerable<Tuple<DataRow, DataRow>>. И для него можно написать свой метод CopyToDataTable

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)