5

我正在使用 LINQ 查询将DataTable对象内的数据转换为简单IEnumerable的自定义 POCO 对象。

我的 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消息:

Option Strict On 不允许从“Object”到“System.Data.DataRow”的隐式转换。

为什么我会收到此错误,我需要做些什么来修复它?我原以为dtMessages.Rows返回了 type 的集合DataRow。这不正确吗?

4

3 回答 3

13

DataTable.Rows- 这是一个DataRowCollection只实现IEnumerable,而不是IEnumerable(Of DataRow)

幸运的是,有一个扩展方法DataTableExtensions可以让你调用AsEnumerable()而不是Rows; AsEnumerable返回一个IEnumerable(Of DataRow)

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

(我更喜欢这个而不是 using dt.Rows.Cast(Of DataRow),因为它给人的印象可能会失败。它更适合DataTable. 两者都可以工作。)

于 2010-08-02T14:46:05.257 回答
8

该类型System.DataTable早于 .Net 中的泛型,因此返回一个普通的旧IEnumerable而不是一个IEnumerable(Of DataRow)即使在引擎盖下它们是DataRow. 因此,dr上述查询中的类型是Object而不是DataRow

您可以通过使用Cast扩展方法使集合的类型显式来解决此问题

From dr As DataRow in dtMessages.Rows.Cast(Of DataRow)
于 2010-08-02T14:45:57.873 回答
3

DataTable.Rows属性返回一个 的集合DataRow,但是该集合没有实现IEnumerable<DataRow>但是IEnumerable,它作为IEnumerable<Object>.

您可以将集合项显式转换为DataRowusing dtMessages.Rows.Cast<DataRow>()

于 2010-08-02T14:48:17.860 回答