如何对JQuery DataTables和通用方法使用Skip()和Take()

时间:2019-01-23 19:01:09

标签: c# asp.net-mvc-5 datatables

我在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遍历记录。

这是配置通用DataTables JavaScript的方式:

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具有Server Side Processing,但是现在检索数据的方式是Linq to Entities(从数据源方法)。我发现一些文章解释了我该怎么做Like this one for example,但是这篇文章返回了JsonResult。使这种方法不那么通用会更容易吗?

1 个答案:

答案 0 :(得分:0)

  

您可以通过多种方式解决此问题,但我会给您提供许多链接   给你启发如何解决问题的灵感,我是我   最后一个解决方案,我只创建这样的模型

     

接口IDatatables,其中T:类{字符串请求URL {get;   组; }

     

ICollection列按钮编辑{get;设置;}
  按钮编辑{get; set;} Ect ..

     

}

     

在您的ActionResult中,您需要构建一个与   请求数据表的参数这是您可以找到的一些链接   与数据表集成的一些启发   https://www.c-sharpcorner.com/article/using-datatables-grid-with-asp-net-mvc/   https://gist.github.com/OllieJones/7448933cc85ee740e990383e4fded412