Как использовать Skip () и Take () с JQuery DataTables и универсальным методом - PullRequest
0 голосов
/ 23 января 2019

У меня есть представление в 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. Не проще ли сделать этот метод не таким универсальным?

1 Ответ

0 голосов
/ 24 января 2019

Вы можете решить эту проблему разными способами, но я дам вам ссылку на многие дать вдохновение тому, как вы можете решить свою проблему, я мой Последнее решение Я только создаю модель, подобную этой

Идентификационные данные интерфейса, где T: class {string request URL {get; задавать; }

Кнопка ICollection Columns Править {получить; установить;}
Кнопка Изменить {получить; set;} Экт ..

}

В вашем ActionResult вам нужно создать класс, который соответствует параметры запроса таблиц данных Вот несколько ссылок, которые вы можете найти вдохновение для вашей интеграции с таблицами данных https://www.c -sharpcorner.com / статьи / с использованием-DataTables-сетки с-Asp-сетчатой ​​MVC / https://gist.github.com/OllieJones/7448933cc85ee740e990383e4fded412

...