CopyToDataTable(Of DataRow)显示语法错误



我试图将LINQ查询的输出转换为数据表,我有以下代码,但它在(Of DataRow)部分显示了语法错误:

Dim X As New EntitiesDim query As IEnumerable(Of DataRow)=From cajero In X.cajero.AsNumerable选择cajeroDim bla=查询。CopyToDataTable(Of DataRow)()

我以这个问题为指导:从LINQ查询结果集填充DataSet或DataTable

如果我使用

query.CopyToDataTable()'而不是过载查询CopyToDataTable(Of DataRow)

它抛出invalidCastException。

我正在寻找一种简单的方法来完成这项任务,这似乎是最简单的方法,不需要太多代码,也不需要实现任何"碎纸机"方法,但如果这是唯一的方法,那么请给我指明正确的方向。

这就是抛出的错误(我将其本地化为英语,西班牙语有点不同):

无法将WhereSelectEnumerableIterator类型的对象转换为IEnumerable System.Data.DataRow 类型的对象


我尝试过以下操作:

声明一个扩展方法,该方法将创建如下数据表:

_公共函数myToDataTable(Of T)(源为IEnumerable(Of T))为DataTableDim属性As PropertyInfo()=GetType(T).GetProperties()将输出标注为新DataTable()对于属性中的每个道具输出Columns.Add(prop.Name,prop.PropertyType)下一个对于源中的每个项目将行Dim为DataRow=输出。NewRow()对于属性中的每个道具row(prop.Name)=道具。GetValue(项,无)下一个输出行.Add(行)下一个返回输出End Function

但在将列添加到数据表时,它总是抛出异常:

DataSet does not support System.Nullable

我还将linq查询更改为:

Dim query=来自X.cajero中的cajero选择cajeroDim bla=query.myToDataTable

根据Jon的建议,我发现了这个问题:

.NET-将通用集合转换为DataTable

这只是给了我最后一点我需要的代码:

output.Columns.Add(prop.Name,If(Nullable.GetUnderlyingType(prop.PropertyType),prop。PropertyType))

row(prop.Name)=If(prop.GetValue(item,Nothing),DBNull.Value)

我认为问题在于您试图转换任意实体类型的IEnumerable<T>,而CopyToDataTable()总是要求输入是某种类型的DataRow的序列。

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

我相信在你提到的问题中,OP已经有了强类型的DataSet——至少答案表明是这样。

最新更新