我试图将 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)