Мне нужно создать несколько отчетов, и многие из них будут просто таблицами сущностей из моей базы данных. Объекты могут быть любого типа, и мне не всегда понадобится весь объект.
Мой текущий подход заключается в создании ViewModel, который содержит поле типа List<List<string>>
, которое представляет мою таблицу, где каждая строка представляет собой список ячеек. Затем представлению нужно только перечислить все строки и столбцы для создания таблицы.
public class ListReportViewModel
{
public string Title;
public List<string> Headings;
public List<List<string>> Rows;
}
Тогда у меня есть код контроллера для заполнения заголовков и строк:
// Get the entities for the report
var tickets = ( from t in _db.Ticket.Include("Company").Include("Caller")
select t );
// Populate the column headings
data.Headings = new List<string>();
data.Headings.Add( "Ticket ID" );
data.Headings.Add( "Company" );
data.Headings.Add( "Caller" );
data.Headings.Add( "Reason for Call" );
// Temporary staging variables
List<List<string>> rows = new List<List<string>>();
List<string> row;
// Populate temporary variables
foreach ( var ticket in tickets )
{
row = new List<string>();
row.Add( ticket.TicketID.ToString() );
row.Add( ticket.Company.Name );
row.Add( ticket.Caller.FirstName + " " + ticket.Caller.LastName );
row.Add( ticket.Subject );
rows.Add( row );
}
// Populate ViewModel field
data.Rows = rows;
Хотя это работает, это кажется неэффективным. Я перебираю весь свой набор результатов, чтобы заполнить ViewModel, а затем представлению придется повторить цикл, чтобы построить отчет.
Мой вопрос: есть ли более простой способ сделать это? Если бы я мог получить свой запрос Linq для возврата IEnumerable<IEnumerable<string>>
, то я мог бы просто использовать строку "data.Rows = tickets
", и представление могло бы проходить через это само.
Я думаю, что должен быть лучший способ сделать это, о котором я не знаю.