【问题标题】:How to convert IQueryable to DataTable如何将 IQueryable 转换为 DataTable
【发布时间】:2012-05-16 12:32:56
【问题描述】:

我使用 LinQ 编写了查询,并使用了 CopyToDataTable 方法。在该行显示从我的数据库类型到System.Data.DataRow 的隐式转换类型错误。

var query = from i in dbContext.Personaldetails
            where i.ID == 1
            select i;

            return query.CopyToDataTable();

有什么建议吗?

【问题讨论】:

    标签: c# asp.net visual-studio-2010 linq


    【解决方案1】:

    CopyToDataTable 需要 DataRow 对象的集合。请参阅如何:Implement CopyToDataTable Where the Generic Type T Is Not a DataRow 来解决此问题。

    更新:如果您的实体有可为空的字段,您可以修改ObjectShredder.ExtendTable 方法。查找新列添加到表的位置,并删除第二个参数,该参数提供列中的数据类型(DataColumn 类不支持可为空的数据类型):

    foreach (PropertyInfo p in type.GetProperties())
    {
        if (!_ordinalMap.ContainsKey(p.Name))
        {
            DataColumn dc = table.Columns.Contains(p.Name) ? table.Columns[p.Name]
                // do not provide column type
                : table.Columns.Add(p.Name); 
    
            _ordinalMap.Add(p.Name, dc.Ordinal);
        }
    }
    

    【讨论】:

    • 我已经实现了这个逻辑,但是在 query.copytodatatable 中显示了不能隐式转换类型的错误。
    • @nanicharan 确保你使用CustomLINQtoDataSetMethods,而不是那些从 LINQ 到数据集的。
    • @nanicharan 我最近使用完全相同的代码创建了表。只需从 msdn 复制粘贴即可。并确保您使用CustomLINQtoDataSetMethods 扩展名。例如。可以直接调用CustomLINQtoDataSetMethods.CopyToDataTable(query)
    • 似乎您在其他类中声明了CustomLINQtoDataSetMethods 类。将其移至顶层,直接在某个命名空间中。
    • 您还可以验证属性类型是否可以为空type.IsGenericType && (type.GetGenericTypeDefinition() == typeof(Nullable<>)) 并提供可以为空的参数类型而不是p.PropertyType.GetGenericArguments()[0]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-07
    • 2020-09-04
    • 2014-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多