0

LINQ クエリの出力をデータテーブルに変換しようとしています。次のコードがありますが、(Of DataRow)一部に構文エラーが表示されます。

Dim X を新しいエンティティとして
Dim query As IEnumerable(Of DataRow) = From cajero In X.CAJERO.AsEnumerable
                                       カジェロを選択
Dim bla = query.CopyToDataTable(Of DataRow)()

この質問をガイドとして使用しています: Filling a DataSet or DataTable from a LINQ query result set

私が使用する場合

query.CopyToDataTable()  
'オーバーロードの代わりに
query.CopyToDataTable(Of DataRow)  

これは、invalidCastException をスローします。

私はこのタスクを達成する簡単な方法を探しています。コードが多すぎず、「シュレッダー」メソッドなどを実装する必要がなく、これが最も簡単な方法のようですが、それが唯一の方法である場合は、私を指摘してください正しい方向。

これはスローされるエラーです(英語にローカライズしましたが、スペイン語では少し異なります):

タイプ WhereSelectEnumerableIterator のオブジェクトをタイプ IEnumerable System.Data.DataRow のオブジェクトに変換できません


私は次のことを試しました:

次のようにデータテーブルを作成する拡張メソッドを宣言します。

_
Public Function myToDataTable(Of T)(source As IEnumerable(Of T)) As DataTable
    Dim プロパティ As PropertyInfo() = GetType(T).GetProperties()

    Dim 出力として New DataTable()

    For Each prop In プロパティ
        output.Columns.Add(prop.Name, prop.PropertyType)
    次

    For Each item In ソース
        Dim 行 As DataRow = output.NewRow()

        For Each prop In プロパティ
            行 (prop.Name) = prop.GetValue(item, Nothing)
        次

        output.Rows.Add(行)
    次

    出力を返す
終了機能

ただし、列をデータテーブルに追加している間は常に例外がスローされます。

DataSet does not support System.Nullable

また、linq クエリを次のように変更しました。

Dim query = From cajero In X.CAJERO
           カジェロを選択

Dim bla = query.myToDataTable

ジョンの提案に従って、私はこの質問を見つけました:

.NET - ジェネリック コレクションを DataTable に変換する

これにより、必要な最後のコードが得られました。

output.Columns.Add(prop.Name, If(Nullable.GetUnderlyingType(prop.PropertyType), prop.PropertyType))

行 (prop.Name) = If(prop.GetValue(item, Nothing), DBNull.Value)

4

1 に答える 1

2

問題はIEnumerable<T>、任意のエンティティ型のを変換しようとしていることにあると思いますが、入力は常にある種の のCopyToDataTable()シーケンスである必要があります。DataRow

エンティティ タイプが実際に から派生していない限りDataRow、それは機能しません。各インスタンスから を作成するLINQ クエリを作成できる可能性がありDataRowますが、そのコードは自分で作成する必要があると思います。

あなたが参照した質問を信じています.OPにはすでに強く型付けされていましたDataSet.少なくとも答えはそうであると示唆していました.

于 2012-10-15T15:37:25.603 に答える