2015-10-09 127 views
1

我想從linq查詢返回數據表,但得到錯誤消息。我在VS2012中使用.NET Framework 4.0。返回從linq查詢數據表

<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但沒有運氣。我沒有在VS2012中獲得CopyToDataTable。

+0

爲什麼它必須是一個DataTable? – OneFineDay

+0

StaffOfficeAccess表沒有辦公室名稱實體。我需要返回辦公室ID和辦公室名稱。可以是數據集,因爲我需要將結果與下拉列表控件綁定。 – 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)