2010-08-02 64 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

相关问题