我试图将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
——至少答案表明是这样。