2017-02-06 3 views
0

Я звоню в метод, который возвращает List<MyViewModel> и хочет заполнить DataTable. Я не могу изменить возвращаемый тип, поскольку этот метод вызывается в нескольких других местах, которые нуждаются в нем в этой форме списка. Я знаю, что мог перебирать список и заполнить таблицу в одной строке за раз, но я надеялся, что было более элегантное решение, например, .Load для iDataReader.Легкий способ заполнения DataTable из списка <Model>?

+1

Просто любопытно - почему вы хотите преобразовать свет и читаемый 'List ' в сложный объект DataTable? – Fabio

+0

Плагин, который я использую для экспорта информации в Excel, требует, чтобы входящие данные были в DataTable. – Matthew

+0

Любое решение будет собирать петлю, поэтому я считаю, что классический цикл с добавлением строки для каждого элемента в списке будет достаточно простым. – Fabio

ответ

2

Из комментариев, кажется, проблема реального является то, что вы хотите экспортировать сильно типизированный список в файл Excel, но библиотека используется только принимает DataTable.

Я предлагаю вам использовать EPPlus библиотеку вместо этого, который может загружать данные как с DataTable и коллекций, например:

sheet.LoadFromDataTable(myTable); 

или

sheet.LoadFromCollection(myList); 

EPPlus доступен как NuGet package тоже ,

В общем, вы можете легко преобразовать коллекцию в DataTable с ToDataTable() расширением MoreLINQ «s, например:

var myTable=myList.ToDataTable(); 

Вы можете найти код внутреннего абонента here. ПодробнееLINQ доступен как a NuGet package.

+0

Спасибо, вы правы в моих намерениях, и я буду смотреть на EPPLus. Я также рассмотрю ссылку, чтобы исследовать ее более точно как учебное. – Matthew

+0

ПодробнееLINQ - с открытым исходным кодом. Вы можете найти источник для ToDataTable [здесь] (https://github.com/morelinq/MoreLINQ/blob/master/MoreLinq/ToDataTable.cs) –

0
public DataTable TableFromMyViewModel(params MyViewModel[] items) 
{ 
    DataTable _result = new DataTable("MyViewModel"); 

    // Do this for each field 
    _result.Columns.Add("Field1", typeof(String)); 
    _result.Columns.Add("Field2", typeof(int)); 
    _result.Columns.Add("Field3", typeof(String)); 

    foreach (MyViewModel _item in items) 
    { 
     DataRow _row = _result.NewRow(); 
     _row["Field1"] = _item.Field1; 
     _row["Field2"] = _item.Field2; 
     _row["Field3"] = _item.Field3; 
     _result.Rows.Add(_row); 
    } 

    return _result; 
} 
+0

Вы правы, спасибо haha ​​ – maksymiuk

Смежные вопросы