0

我试图将 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 - 将通用集合转换为 DataTable

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

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

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

4

1 回答 1

2

我认为问题在于您正在尝试转换IEnumerable<T>任意实体类型 - 而始终CopyToDataTable()要求输入是某种.DataRow

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

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

于 2012-10-15T15:37:25.603 回答