如何使用Datatables.AspNet.Mvc5进行服务器端排序

Jiv*_*man 3 c# linq asp.net-mvc entity-framework datatables

我正在尝试使用 ASP.NET MVC 和实体框架对 jQuery DataTables 进行服务器端处理。我遇到了Datatables.AspNet Nuget 包,但我不清楚如何使用它在单击表标题时对列进行动态排序。

在Datatables.AspNet GitHub 上的示例中,有这样的内容:

public ActionResult PageData(IDataTablesRequest request)
{
    var data = Models.SampleEntity.GetSampleData(); 
    var filteredData = data.Where(_item => _item.Name.Contains(request.Search.Value));

    // Paging filtered data.
    var dataPage = filteredData.Skip(request.Start).Take(request.Length);

    var response = DataTablesResponse.Create(request, data.Count(), filteredData.Count(), dataPage);

    return new DataTablesJsonResult(response, JsonRequestBehavior.AllowGet);
}
Run Code Online (Sandbox Code Playgroud)

但我不确定如何根据 IDataTablesRequest 对象的内容进行动态排序,如下所示:

public interface IDataTablesRequest
{
    int Draw { get; }
    int Start { get; }        
    int Length { get; }
    ISearch Search { get; }
    IEnumerable<IColumn> Columns { get; }
    IDictionary<string, object> AdditionalParameters { get; }
}

public interface ISort
{
    int Order { get; }
    SortDirection Direction { get; }
}

public enum SortDirection
{
    Ascending = 0,
    Descending = 1
}
Run Code Online (Sandbox Code Playgroud)

nol*_*ogo 5

看看这个答案:https://github.com/ALMMa/datatables.aspnet/issues/26

以供参考:

public static IQueryable<T> OrderBy<T>(this IQueryable<T> source, IEnumerable<DataTables.AspNet.Core.IColumn> sortModels)
        {
            var expression = source.Expression;
            int count = 0;
            foreach (var item in sortModels)
            {
                var parameter = Expression.Parameter(typeof(T), "x");
                var selector = Expression.PropertyOrField(parameter, item.Field);
                var method = item.Sort.Direction == DataTables.AspNet.Core.SortDirection.Descending ?
                    (count == 0 ? "OrderByDescending" : "ThenByDescending") :
                    (count == 0 ? "OrderBy" : "ThenBy");
                expression = Expression.Call(typeof(Queryable), method,
                    new Type[] { source.ElementType, selector.Type },
                    expression, Expression.Quote(Expression.Lambda(selector, parameter)));
                count++;
            }
            return count > 0 ? source.Provider.CreateQuery<T>(expression) : source;
        }
Run Code Online (Sandbox Code Playgroud)

所以你可以执行以下操作:

var orderColums = request.Columns.Where(x => x.Sort != null);
 var dataPage = data.OrderBy(orderColums).Skip(request.Start).Take(request.Length);
Run Code Online (Sandbox Code Playgroud)