【发布时间】:2015-11-04 16:10:38
【问题描述】:
我想编写将 Sql Server 过程结果作为DataTable 对象返回的通用代码。然后我编写了下面的代码,但是,我偶然发现了DataTable.Rows.Add() 期待params object[] 参数的问题,而我必须传递的是IEnumerable<string>。
public static DataTable GetProcedureResults(int id)
{
return GetQueryResultAsDataTable<MyProcedure_Result>(_sqlServerDB.MyProcedure(id));
}
private static DataTable GetQueryResultAsDataTable<T>(ObjectResult<T> objectResult)
{
DataTable resultAsDataTable = new DataTable("Result");
var columns = typeof(T).GetProperties();
foreach (var column in columns)
{
resultAsDataTable.Columns.Add(column.Name, typeof(string));
}
foreach (var resultRecord in objectResult)
{
var fields = resultRecord.GetType().GetProperties().Select(p => p.GetValue(resultRecord).ToString());
resultAsDataTable.Rows.Add(fields);
}
return resultAsDataTable;
}
熟悉这个问题的朋友可能已经猜到我最后的数据表是这样的:
这些值都被视为一个对象,因此都被插入到第一列中。
这里有什么解决方法(如果有的话)?我在其他帖子中读到似乎 C#6 会修复这个问题,除此之外没有找到清晰简洁的解决方案。
【问题讨论】:
-
你不能只做
resultAsDataTable.Rows.Add(fields.ToArray());吗? -
@DavidL:澄清:我想“展平” IEnumerable
以便它变成一个 params T[] 对象,从而正确填充数据表。例如:如果我的 IEnumerable 是 List {1, 4, 5, 6} 我希望它被视为 datatable.Rows.Add(1, 4, 5, 6); -
允许为参数 args 传递 IEnumerable 只是 C#6 的提议;但它没有进入最终版本。
标签: c# parameters system.reflection