当我使用下面的方法将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个或更多列具有额外数据,我需要跳过并删除额外生成的列。 怎么做?或者我做错了什么?
答案 0 :(得分:1)
例如,如果Linq结果有5列,则数据表将包含6个或更多具有额外数据的列
显然你所谓的“Linq结果”有这些“列”。您可以使用调试器轻松检查提供该参数的Linq函数或参数v
本身。
如果我将结果连接到网格视图中,一切正常
首先,目前尚不清楚你所谈论的是什么“网格视图”。假设它是标准的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;
}