У меня есть представление в ASP.NET MVC 5, которое возвращает все записи объекта сразу, более 40 000 записей. (Ленивая загрузка включена, поэтому она возвращает даже больше данных, чем просто.) Я всегда получаю исключение нехватки памяти, как и ожидалось. Поэтому мне нужно ограничить отображаемые данные, но оставить все данные доступными для отображения при изменении страницы или выполнении поиска.
Это универсальный метод, который запрашивает источник данных для получения результатов. Manager.AllAsync
- это универсальный метод Entity Framework, который запрашивает объект, предоставленный через TEntity
:
public async Task<ActionResult> DataTableAsync<TEntity>(AlertModel alert, string viewName = null) where TEntity : class
{
// get data
var data = (from a in await Manager.AllAsync<TEntity>()
select a).ToList();
// create model with alert
var response = new TableModel<TEntity>
{
Alert = alert,
Data = data
};
// return partial data view
return PartialView(viewName ?? $"_{typeof(TEntity).Name}Table", response);
}
Вот определение TableModel
public class TableModel<TEntity>
{
/// <summary>
/// Alert for the model.
/// </summary>
public AlertModel Alert { get; set; }
/// <summary>
/// Data from the database.
/// </summary>
public IList<TEntity> Data { get; set; }
}
Вот определение AllAsync
public virtual async Task<IList<T>> AllAsync<T>() where T : class
{
try
{
return await Context.Set<T>().ToListAsync();
}
catch (ArgumentNullException ex)
{
throw new InvalidOperationException($"Invalid state: {typeof(T).Name} DbSet is null.", ex);
}
}
Тогда представление просто перебирает записи, используя foreach
.
Вот как настроен универсальный JavaScript DataTables:
function makeDataTable(id) {
var selector = '#' + id;
$(selector).DataTable({
order: [],
search: {
smart: false
},
stateSave: true,
deferRender: true,
columnDefs: [{
targets: 'no-sort',
orderable: false
},
{
targets: 'date-col',
type: 'date',
orderSequence: [
'desc',
'asc'
]
}],
lengthMenu: [
[10, 15, 20, -1],
[10, 15, 20, 'All']
]
});
$(selector).width('100%');
}
Я не уверен, как опция DataTables Show
взаимодействует с методом, чтобы отображать только очень много одновременно, или как Show All
без попадания в исключение out of memory
. Я знаю, что DataTables имеет Обработка на стороне сервера , но способ получения данных теперь - это Linq to Entities (из метода источника данных). Я нашел несколько статей, которые объясняют, что я должен делать Как эта, например, , но эта возвращает JsonResult
. Не проще ли сделать этот метод не таким универсальным?