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)