У меня была такая же проблема, что вы не можете создать DataTable
и, следовательно, просто свалить это на лист.
Недостаток поддержки DataTable
в Core заставляет вас создавать сильно типизированные объекты, а затем прокручивать их и отображать их на выходе EPPlus.
Так очень простой пример заключается в следующем:
// Get your data directly from EF,
// or from whatever other source into a list,
// or Enumerable of the type
List<MyEntity> data = _whateverService.GetData();
using (ExcelPackage pck = new ExcelPackage())
{
// Create a new sheet
var newSheet = pck.Workbook.Worksheets.Add("Sheet 1");
// Set the header:
newSheet.Cells["A1"].Value = "Column 1 - Erm ID?";
newSheet.Cells["B1"].Value = "Column 2 - Some data";
newSheet.Cells["C1"].Value = "Column 3 - Other data";
row = 2;
foreach (var datarow in data)
{
// Set the data:
newSheet.Cells["A" + row].Value = datarow.Id;
newSheet.Cells["B" + row].Value = datarow.Column2;
newSheet.Cells["C" + row].Value = datarow.Cilumn3;
row++;
}
}
Итак, вы принимаете перечислимый источник и сильно типизированный объект, который вы можете сделать прямо из запроса EF, или модель представления или что-нибудь иначе, а затем перейдем к отображению.
Я использовал это, и производительность появляется - конечному пользователю - наравне с методом DataTable
. Я не проверял источник, но меня не удивило бы, если метод DataTable
просто делает то же самое внутри и перебирает каждую строку.
Вы можете создать метод расширения для использования генериков для передачи в списке объектов и использовать отражение, чтобы правильно отобразить его. Возможно, я посмотрю проект и посмотрю, могу ли я внести свой вклад.
Изменить, чтобы добавить:
В .NET Ядра оказывается, от вопросов трекера GitHub, что поддержка DataTable
является довольно низко в списке приоритетов, и не ожидаем, что это в ближайшее время. Я думаю, что это также философский момент, так как концепция, как правило, вы пытаетесь использовать сильно типизированные объекты. Таким образом, раньше вы могли запускать SQL Query в DataTable
и запускать с этим ... Теперь вы должны запустить этот запрос в модель, либо непосредственно сопоставленную с таблицей с Entity Framework
через DbSet
, либо с помощью ModelBinding
и проходящей тип запроса.
У вас тогда есть IQueryable<T>
, который служит вашей строго типизированной заменой на DataTables
. Чтобы быть справедливым в этом подходе, в 99% случаев это действенный и лучший подход ... Однако всегда будут недостатки DataTables
, которые вызовут проблемы и должны быть проработаны!
Далее Edit
В ADO.NET
вы можете конвертировать datareader
в строго типизированных список объектов: How can I easily convert DataReader to List<T>? на имя, но один пример. С помощью этого списка вы можете сделать свое отображение оттуда.
Если вы хотите/должны использовать ASP.NET Core
, который нацелен на ASP.NET Core framework
, вам нужно будет это сделать. Если вы можете настроить таргетинг на Net 4.5, используя основной проект, тогда вы сможете использовать System.Data
и вернуть DataTables
- единственное предостережение, которое вам нужно использовать для работы с серверами Windows и IIS.
Вам действительно нужен полный каркас .Net Core
? Вам нужно разместить на Linux? Если нет, и вам действительно нужны DataTables, просто настройте старую платформу.
Спасибо. Но я не использую EF - я хочу придерживаться ADO.NET. Как передать это на SQL-сервер? выглядит как «грязное» решение простой проблемы ... – developer82
Поддерживает ли ASP.NET Core поддержку ADO.NET? Не удается найти его в документах как быстрый поиск ... – RemarkLima
EF построен на ADO.NET AFAIK, так что я думаю, да? – developer82