2015-10-09 1 views
1

Я пытаюсь вернуть таблицу данных из запроса linq, но получаю сообщение об ошибке. Я использую .net framework 4.0 в VS2012.return Datatable from linq query

<Table> 
Public Class StaffOfficeAccess 

<Column(CanBeNull:=False, IsPrimaryKey:=True, IsDbGenerated:=True)> 
Public Property StaffOfficeAccessID As Int32 = 0 
<Column> 
Public Property StaffID As Int32 = 0 
<Column> 
Public Property OfficeID As Int32 = 0 
<Column(IsVersion:=True, IsDbGenerated:=True)> 
Public Property Version As Byte() 
End Class 

'----------------------------'

Public Function GetByStaffID(ByVal staffID As Int32) As DataTable 

    Dim query As IEnumerable(Of DataRow) = CType((From oa In db.StaffOfficeAccess.AsEnumerable() _ 
      Join o In db.Office.AsEnumerable() On oa.OfficeID Equals o.OfficeID _ 
      Select oa.OfficeID, 
       o.OfficeName), Global.System.Collections.Generic.IEnumerable(Of Global.System.Data.DataRow)) 

    Dim table As DataTable = System.Data.DataTableExtensions.CopyToDataTable(query) 

    Return table 
End Function 

«----- --error ---------- '

Невозможно привести объект типа 'd__61 4[staff.Objects.StaffOfficeAccess,AMIS.Objects.Office,System.Int32,VB$AnonymousType_0 2 [System.Int32, System.String]]' к типу' System.Collections.Generic.IEnumerable `1 [System.Data.DataRow]».

Я пробовал здесь пример https://msdn.microsoft.com/en-us/library/bb396189%28v=vs.110%29.aspx, но не повезло. Я не получаю CopyToDataTable в VS2012.

+0

Почему это должно быть DataTable? – OneFineDay

+0

Таблица StaffOfficeAccess не имеет объекта имени офиса. Мне нужно вернуть идентификатор офиса и имя офиса. Может быть набором данных, поскольку мне нужно связать результаты с выпадающим списком. – user1263981

ответ

0

Я пробовал это, и он работает.

Dim dt As New DataTable() 
    dt.Columns.Add("OfficeID", GetType(Integer)) 
    dt.Columns.Add("OfficeName", GetType(String)) 


    Dim query = From oa In db.StaffOfficeAccess.AsEnumerable() _ 
        Join o In db.Office.AsEnumerable() On oa.OfficeID Equals o.OfficeID _ 
        Select oa.OfficeID, 
         o.OfficeName 

    For Each item In query 
     Dim dr As DataRow = dt.NewRow() 
     dr("OfficeID") = item.OfficeID 
     dr("OfficeName") = item.OfficeName 
     dt.Rows.Add(dr) 
    Next 
1

Еще один подход с использованием метода Aggregate расширения MSDN

Dim dt As New DataTable() 
dt.Columns.Add("OfficeID", GetType(Integer)) 
dt.Columns.Add("OfficeName", GetType(String)) 

Dim query = From oa In db.StaffOfficeAccess.AsEnumerable() 
      Join o In db.Office.AsEnumerable() 
      On oa.OfficeID Equals o.OfficeID 
      Select oa.OfficeID, o.OfficeName 

query.Aggregate(Of DataTable)(dt, 
           Function(dtb, o) 
            Dim dr As DataRow = dtb.NewRow() 
            dr.SetField("OfficeID", o.OfficeID) 
            dr.SetField("OfficeName", o.OfficeName) 
            dtb.Rows.Add(dr) 
            Return dtb 
           End Function)