Я хотел написать общий код, который возвращает результаты процедуры Sql Server как объекты DataTable. Затем я написал код ниже, но я наткнулся на проблему DataTable.Rows.Add(), ожидающую параметр params object [], в то время как я должен пройти IEnumerable.Есть ли способ обработать IEnumerable <T> как объект params T []?
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;
}
Для тех, кто знаком с этим вопросом, вы уже догадались, что мой DataTable в конце выглядит следующим образом:
Значения трактуются как единый объект, таким образом, все вставляются в 1-й столбец.
Какое обходное решение здесь, если оно есть? Я читал в других сообщениях, которые, кажется, C# 6 будет исправить этот вопрос, кроме этого, не нашел четкого и краткого решения.
Может вы не просто 'resultAsDataTable.Rows.Add (fields.ToArray());'? –
@DavidL: Разъяснение: Я хотел «сгладить» IEnumerable так, чтобы он превратился в объект params T [], и, следовательно, datatable заселен правильно. Пример: если мой IEnumerable является списком {1, 4, 5, 6} Я бы хотел, чтобы он обрабатывался как datatable.Rows.Add (1, 4, 5, 6); –
Veverke
Разрешая передавать IEnumerable для params args, было только предложение для C# 6; но он не попал в финальный выпуск. – Sehnsucht