在将Linq结果转换为数据表时额外列

本文关键字:数据表 Linq 结果 转换 在将 | 更新日期: 2023-09-27 18:13:36

当我使用下面的方法将Linq结果转换为数据表时,我得到了一些额外的列!!

private static DataTable LinqQueryToDataTable(IEnumerable<dynamic> v)
{
    var firstRecord = v.FirstOrDefault();
    if (firstRecord == null)
        return null;
    PropertyInfo[] infos = firstRecord.GetType().GetProperties();
    DataTable table = new DataTable();
    foreach (var info in infos)
    {
        Type propType = info.PropertyType;
        if (propType.IsGenericType
            && propType.GetGenericTypeDefinition() == typeof(Nullable<>))
        {
            table.Columns.Add(info.Name, Nullable.GetUnderlyingType(propType));
        }
        else
        {
            table.Columns.Add(info.Name, info.PropertyType);
        }
    }
    DataRow row;
    foreach (var record in v)
    {
        row = table.NewRow();
        for (int i = 0; i < table.Columns.Count; i++)
        {
            row[i] = infos[i].GetValue(record,null) != null ? infos[i].GetValue(record,null) : DBNull.Value;
        }
        table.Rows.Add(row);
    }
    table.AcceptChanges();
    return table;
}

例如,如果Linq结果有5列,数据表将有6列或更多列的额外数据,我需要跳过并删除额外生成的列。怎么做呢?还是我做错了什么?

在将Linq结果转换为数据表时额外列

例如,如果Linq result有5列,那么数据表将有6列或更多的额外数据

显然你所说的"Linq结果"有这些"列"。您可以使用调试器轻松检查提供该功能的Linq函数或参数v本身。

如果我将结果连接到网格视图中,一切都OK

首先,不清楚你说的是什么"网格视图"。假设它是一个标准的WF或WPF数据网格视图。与通常的UI一样,您在那里看到的可能不是您得到的。UI组件不像在代码中那样直接使用反射,而是使用System.ComponentModel.TypeDescriptor服务。一个标准的行为是抑制属性与BrowsableAttribute = No,我怀疑这是你的情况。但是没有你实际的Linq结果,我们只能猜测——你是唯一一个可以检查的人。

无论如何,如果你是在WF中,你可以使用以下命令:

private static DataTable LinqQueryToDataTable(IEnumerable<dynamic> v)
{
    var firstRecord = v.FirstOrDefault();
    if (firstRecord == null)
        return null;
    var infos = ListBindingHelper.GetListItemProperties(v);
    DataTable table = new DataTable();
    foreach (PropertyDescriptor info in infos)
    {
        Type propType = info.PropertyType;
        if (propType.IsGenericType
            && propType.GetGenericTypeDefinition() == typeof(Nullable<>))
        {
            table.Columns.Add(info.Name, Nullable.GetUnderlyingType(propType));
        }
        else
        {
            table.Columns.Add(info.Name, info.PropertyType);
        }
    }
    DataRow row;
    foreach (var record in v)
    {
        row = table.NewRow();
        for (int i = 0; i < table.Columns.Count; i++)
        {
            row[i] = infos[i].GetValue(record) ?? DBNull.Value;
        }
        table.Rows.Add(row);
    }
    table.AcceptChanges();
    return table;
}