在将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 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;
}