CopyToDataTable(Of DataRow)显示语法错误

时间:2012-10-15 15:23:03

标签: vb.net linq

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

Dim X As New Entities
Dim query As IEnumerable(Of DataRow) = From cajero In X.CAJERO.AsEnumerable
                                       Select cajero
Dim bla = query.CopyToDataTable(Of DataRow)()

我正在使用这个问题作为指导: Filling a DataSet or DataTable from a LINQ query result set

如果我使用

query.CopyToDataTable()  
'instead of the overload 
query.CopyToDataTable(Of DataRow)  

它会抛出invalidCastException。

我正在寻找一种简单的方法来完成这项任务,这似乎是最简单的方法,没有太多的代码,不得不实施任何“碎纸机”等方法,但如果这是唯一的方法,那么请指出我正确的方向。

这是抛出的错误(我把它本地化为英语,它的西班牙语略有不同):

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


我尝试了以下内容:

声明一个可以创建数据表的扩展方法:

 _
Public Function myToDataTable(Of T)(source As IEnumerable(Of T)) As DataTable
    Dim properties As PropertyInfo() = GetType(T).GetProperties()

    Dim output As New DataTable()

    For Each prop In properties
        output.Columns.Add(prop.Name, prop.PropertyType)
    Next

    For Each item In source
        Dim row As DataRow = output.NewRow()

        For Each prop In properties
            row(prop.Name) = prop.GetValue(item, Nothing)
        Next

        output.Rows.Add(row)
    Next

    Return output
End Function

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

DataSet does not support System.Nullable

我还将linq查询更改为:

Dim query = From cajero In X.CAJERO
           Select cajero

Dim bla = query.myToDataTable

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

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

1 个答案:

答案 0 :(得分:2)

我认为问题在于您尝试转换任意实体类型的IEnumerable<T> - 而CopyToDataTable()始终要求输入为某些的序列有点DataRow

除非你的实体类型实际上来自DataRow,否则这不会起作用。您可以从每个实例编写一个创建 DataRow的LINQ查询,但我相信您必须自己编写该代码。

我相信你引用的问题,OP已经一个强类型DataSet - 至少答案表明是这种情况。