CopyToDataTable(Of DataRow) 显示语法错误

Posted

技术标签:

【中文标题】CopyToDataTable(Of DataRow) 显示语法错误【英文标题】:CopyToDataTable(Of DataRow) shows syntax error 【发布时间】:2012-10-05 14:46:09 【问题描述】:

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

按照乔恩的建议,我发现了这个问题:

.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)

【问题讨论】:

错误说明了什么? @SLaks 我编辑了问题,以便您看到错误 X.CAJERO是什么类型的? @Jon 它是从数据库导入的 EdmEntityType,只是一个包含几个字段的表。 【参考方案1】:

我认为问题在于您正在尝试转换任意实体类型的 IEnumerable<T> - 而 CopyToDataTable() 始终要求输入是 some 类型的 @987654324 序列@。

除非您的实体类型实际上派生自 DataRow,否则这是行不通的。您可能会编写一个 LINQ 查询,该查询创建每个实例的 DataRow,但我相信您必须自己编写该代码。

我相信你提到的问题,OP 已经一个强类型的 DataSet - 至少答案表明是这样的。

【讨论】:

是的,这就是我可以从他对 order.Field("OrderDate") 的使用中得出的结论,是否要求提供一些代码来开始使用 LINQ Query从每个实例创建一个 DataRow? @AndreiD:那么您尝试了什么,出了什么问题? (我已经很久没有做过很多 ADO.NET 了,尤其是原始 DataTable 值......如果你有一个强类型的数据表,你是否也有强类型的行类型?如果是这样,那很可能是你的答案...) 我编辑了显示尝试从结果集中创建 DataTable 的问题 @AndreiD:对,看起来您需要删除可空性,并转换为 DbNull.Value。

以上是关于CopyToDataTable(Of DataRow) 显示语法错误的主要内容,如果未能解决你的问题,请参考以下文章

c# DataRow[]转Datatable

asp.net 输出微信自定义菜单json

20191017_datatable.select() 数据源中没有dataRow

wpf中如何获得dataGrid选中行的值

避免DataTable查询和构建中的重复

DataTable CAST 成集合后,进行自定义排序再转换回DataTable