我试图将 LINQ 查询的输出转换为数据表,我有以下代码,但它在该(Of DataRow)部分显示语法错误:
将 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(数据行)
它抛出一个 invalidCastException。
我正在寻找一种简单的方法来完成这项任务,这似乎是最简单的方法,没有太多代码并且必须实现任何“碎纸机”方法等,但如果这是唯一的方法,那么请指出我正确的方向。
这是抛出的错误(我将其本地化为英语,西班牙语有点不同):
无法将 WhereSelectEnumerableIterator 类型的对象转换为 IEnumerable System.Data.DataRow 类型的对象
我尝试了以下方法:
声明一个可以像这样创建数据表的扩展方法:
_
公共函数 myToDataTable(Of T)(source As IEnumerable(Of T)) As DataTable
暗淡属性 As PropertyInfo() = GetType(T).GetProperties()
将输出调暗为新 DataTable()
对于每个 prop In 属性
output.Columns.Add(prop.Name, prop.PropertyType)
下一个
对于源中的每个项目
暗淡行 As DataRow = output.NewRow()
对于每个 prop In 属性
row(prop.Name) = prop.GetValue(item, Nothing)
下一个
output.Rows.Add(行)
下一个
返回输出
结束功能
但是在将列添加到数据表时总是会抛出异常:
DataSet does not support System.Nullable
我还将 linq 查询更改为:
暗查询 = 来自 X.CAJERO 中的 cajero
选择卡杰罗
Dim bla = query.myToDataTable
按照乔恩的建议,我发现了这个问题:
这只是给了我需要的最后一点代码:
output.Columns.Add(prop.Name, If(Nullable.GetUnderlyingType(prop.PropertyType), prop.PropertyType))
和
row(prop.Name) = If(prop.GetValue(item, Nothing), DBNull.Value)