我试图将LINQ查询的输出转换为数据表,我有以下代码,但它在(Of DataRow)
部分显示语法错误:
Dim X As New Entities Dim query As IEnumerable(Of DataRow) = From cajero In X.CAJERO.AsEnumerable Select cajero Dim bla = query.CopyToDataTable(Of DataRow)()
我正在使用这个问题作为指导: Filling a DataSet or DataTable from a LINQ query result set
如果我使用
query.CopyToDataTable() 'instead of the overload query.CopyToDataTable(Of DataRow)
它会抛出invalidCastException。
我正在寻找一种简单的方法来完成这项任务,这似乎是最简单的方法,没有太多的代码,不得不实施任何“碎纸机”等方法,但如果这是唯一的方法,那么请指出我正确的方向。
这是抛出的错误(我把它本地化为英语,它的西班牙语略有不同):
无法将WhereSelectEnumerableIterator类型的对象转换为IEnumerable类型的对象System.Data.DataRow
我尝试了以下内容:
声明一个可以创建数据表的扩展方法:
_ Public Function myToDataTable(Of T)(source As IEnumerable(Of T)) As DataTable Dim properties As PropertyInfo() = GetType(T).GetProperties() Dim output As New DataTable() For Each prop In properties output.Columns.Add(prop.Name, prop.PropertyType) Next For Each item In source Dim row As DataRow = output.NewRow() For Each prop In properties row(prop.Name) = prop.GetValue(item, Nothing) Next output.Rows.Add(row) Next Return output End Function
但是在将数据列添加到数据表时,它总是抛出异常:
DataSet does not support System.Nullable
我还将linq查询更改为:
Dim query = From cajero In X.CAJERO Select cajero Dim bla = query.myToDataTable
根据Jon的建议,我发现了这个问题:
.NET - Convert Generic Collection to DataTable
这给了我所需的最后一段代码:
output.Columns.Add(prop.Name, If(Nullable.GetUnderlyingType(prop.PropertyType), prop.PropertyType))
和
row(prop.Name) = If(prop.GetValue(item, Nothing), DBNull.Value)
答案 0 :(得分:2)
我认为问题在于您尝试转换任意实体类型的IEnumerable<T>
- 而CopyToDataTable()
始终要求输入为某些的序列有点DataRow
。
除非你的实体类型实际上来自DataRow
,否则这不会起作用。您可以从每个实例编写一个创建 DataRow
的LINQ查询,但我相信您必须自己编写该代码。
我相信你引用的问题,OP已经有一个强类型DataSet
- 至少答案表明是这种情况。