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)