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.Rowstype のコレクションを返すと思っていたでしょうDataRow。これは正しくありませんか?

4

3 に答える 3

13

見てDataTable.Rowsください - それDataRowCollectionは実装するだけIEnumerableで、 ではありませんIEnumerable(Of DataRow)

幸いなことに、 ;の代わりに呼び出せる拡張メソッドがDataTableExtensionsあります。を返します:AsEnumerable()RowsAsEnumerableIEnumerable(Of DataRow)

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

(失敗する可能性dt.Rows.Cast(Of DataRow)のある何かの印象が少ないため、を使用するよりもこれを好みます。 に合わせて調整されています。ただし、両方とも機能します。)DataTable

于 2010-08-02T14:46:05.257 に答える
8

この型System.DataTableは .Net のジェネリックよりも前のものであるため、内部では .NETのインスタンスであるにもかかわらずIEnumerable、. したがって、上記のクエリの型は is and notです。IEnumerable(Of DataRow)DataRowdrObjectDataRow

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>ます。

DataRowを使用して、コレクション項目を明示的にキャストできますdtMessages.Rows.Cast<DataRow>()

于 2010-08-02T14:48:17.860 に答える