2010-08-02 57 views
4

我正在使用LINQ查詢將DataTable對象內的數據轉換爲自定義POCO對象的簡單IEnumerable爲什麼編譯器認爲這是一個Object而不是DataRow?

我的LINQ查詢:

Dim dtMessages As DataTable 

    '...dtMessages is instantiated ByRef in a helper data access routine... ' 

    Dim qry = From dr As DataRow In dtMessages.Rows 
       Select New OutboxMsg With { 
        .ComputerID = dr(dcComputerID), 
        .MessageData = dr(dcMessageData), 
        .OutBoxID = dr(dcOutBoxID), 
        .OutBoxReceivedID = dr(dcOutBoxReceivedID), 
        .TrxDate = dr(dcTrxDate) 
       } 

然而,編譯dr As DataRow下拋出一個警告消息,與消息:

選項嚴格On不允許從「對象」到「系統的隱式轉換.Data.DataRow」。

爲什麼我得到這個錯誤,我需要做些什麼來解決它?我原以爲dtMessages.Rows返回類型DataRow的集合。這是不正確的?

+1

顯示dtMessages是如何聲明和實例化的。 – bzlm 2010-08-02 14:42:42

+0

@bzlm我更新了我的帖子,更多信息 – 2010-08-02 14:46:03

+0

只需關閉'Option Strict'!我小子,我小子。 – Marc 2010-08-02 14:57:13

回答

12

樂的類型在DataTable.Rows - 這是一個DataRowCollection只實現IEnumerable,不IEnumerable(Of DataRow)

幸運的是,在DataTableExtensions中有一個擴展方法,它允許您撥打AsEnumerable()而不是Rows; AsEnumerable返回IEnumerable(Of DataRow)

Dim qry = From dr As DataRow In dtMessages.AsEnumerable() 
      ... 

(我更喜歡這種過度使用dt.Rows.Cast(Of DataRow),因爲它提供了以下的一些東西,力量失敗的印象,這是對DataTable更適合雙方將工作,雖然。)

7

類型System.DataTable早在.net泛型並因此返回一個普通的舊IEnumerable,而不是一個IEnumerable(Of DataRow),即使它們的DataRow實例引擎蓋下。因此,上述查詢中的dr的類型是Object而不是DataRow

您可以解決此通過使用Cast擴展方法,使集合明確

From dr As DataRow in dtMessages.Rows.Cast(Of DataRow) 
3

DataTable.Rows屬性返回DataRow的集合,但該集合不會執行IEnumerable<DataRow>,而是IEnumerable,它的作用是IEnumerable<Object>

您可以使用dtMessages.Rows.Cast<DataRow>()明確地將收集項目轉換爲DataRow

相關問題