Jquery Datatable服务器端排序和筛选性能

Jquery Datatable服务器端排序和筛选性能,jquery,asp.net-mvc,datatables,Jquery,Asp.net Mvc,Datatables,如何提高数据表服务器端处理中的排序和筛选性能 我有100K条记录,在下面的示例中,我只显示了2列,但有25列 这是我的密码 var allrecords = UserDataAccess.GetAllUsers(Uow).ToList(); // here i call ToList in order to use the count var totalRec = allrecords.Count; int filteredRecords; IList<User

如何提高数据表服务器端处理中的排序和筛选性能

我有100K条记录,在下面的示例中,我只显示了2列,但有25列

这是我的密码

var allrecords = UserDataAccess.GetAllUsers(Uow).ToList(); // here i call ToList in order to use the count

    var totalRec = allrecords.Count;
    int filteredRecords;

    IList<User> filter;
    IEnumerable<User> sort;

    // filter
    if (!string.IsNullOrEmpty(param.Search.Value))
    {
        filter = UserSearch(param.Search.Value, allrecords).ToList();
        filteredRecords = filter.Count;

    }
    else
    {
        filter = allrecords;
        filteredRecords = totalRec;
    }

    // sort
    if (param.SortOrder != null && param.Order != null)
    {
        sort =
            Sort(filter, param.Order[0], param.SortOrder)
                .Skip(param.Start)
                .Take(param.Length);
    }
    else
    {
        sort = filter.Skip(param.Start)
                .Take(param.Length);
    }


internal static IEnumerable<User> Sort(IEnumerable<User> data, DTOrder order, string columnName)
 {
  var sortColumnIndex = order.Column;
   Func<User, string> orderingFunction = (
        c =>sortColumnIndex == 0 ? c.Name : sortColumnIndex == 1 ?
        c.IC :ortColumnIndex == 2 ? c.Age :"");
        var sortDirection = order.Dir.ToString().ToLower(); // asc or desc
        return sortDirection == "asc" ? data.OrderBy(orderingFunction) : data.OrderByDescending(orderingFunction);

  }

    internal static IEnumerable<User> UserSearch(string search, IEnumerable<User> records)
    {
        return records
            .Where(c => c.Name.ToLower().Contains(search.ToLower())
                            ||
                            c.FuelAssembly.Lot != null && c.IC .ToString().ToLower().Contains(search.ToLower())
                            ); ;

    }
var allrecords=UserDataAccess.GetAllUsers(Uow.ToList();//这里我调用ToList以使用计数
var totalRec=allrecords.Count;
int过滤器记录;
IList过滤器;
可数排序;
//滤器
如果(!string.IsNullOrEmpty(param.Search.Value))
{
filter=UserSearch(param.Search.Value,allrecords).ToList();
filteredRecords=filter.Count;
}
其他的
{
过滤器=所有记录;
filteredRecords=totalRec;
}
//分类
if(param.SortOrder!=null&¶m.Order!=null)
{
分类=
排序(筛选器,参数顺序[0],参数排序器)
.Skip(参数开始)
.取(参数长度);
}
其他的
{
排序=筛选.跳过(参数开始)
.取(参数长度);
}
内部静态IEnumerable排序(IEnumerable数据、DTOrder顺序、字符串列名)
{
var sortColumnIndex=order.Column;
Func orderingFunction=(
c=>sortColumnIndex==0?c。名称:sortColumnIndex==1?
c、 IC:ortColumnIndex==2?c.年龄:);
var sortDirection=order.Dir.ToString().ToLower();//asc或desc
return-sortDirection==“asc”?data.OrderBy(orderingFunction):data.OrderByDescending(orderingFunction);
}
内部静态IEnumerable用户搜索(字符串搜索、IEnumerable记录)
{
退货记录
.Where(c=>c.Name.ToLower().Contains(search.ToLower())
||
c、 FuelAssembly.Lot!=null&&c.IC.ToString().ToLower().Contains(search.ToLower())
); ;
}
我该如何改进这一点?我还输入了以下代码进行排序,但我的id给出了一个错误

public static IOrderedQueryable<TSource> Sort<TSource, TKey>(this IQueryable<TSource> source, Func<TSource, TKey> keySelector, bool descending = false)
{
  if (descending) return source.OrderByDescending(keySelector);
  else return source.OrderBy(keySelector);
}
公共静态IOrderedQueryable排序(此IQueryable源,Func keySelector,bool descending=false)
{
if(降序)返回source.OrderByDescending(keySelector);
else返回source.OrderBy(keySelector);
}
无法将类型“System.Linq.IOrderedEnumerable”隐式转换为“System.Linq.IOrderedQueryable”


对UserDataAccess.GetAllUsers(Uow).ToList()进行排序和筛选需要很长时间-每次请求都会获取整个表。如果只显示记录和列的子集,则不要获取整个表。在LINQ查询中执行过滤和排序,以便数据库可以在将记录返回给您之前进行过滤和排序(非常有效)。这可以包括一个
.Select()
子句,该子句也只选择自定义视图模型中的一部分列,因为您不需要所有列。但我需要jquery Datatables所需的总记录计数,或者可能有一种方法可以在不获取整个表的情况下获取总计数?虽然我无法保证
UserDataAccess.GetAllUsers(Uow)
在内部所做的任何事情,但LINQ to Entities支持使用
.count()
比具体化整个表和计算内存中的记录要高效得多。您可以在表达式树上使用
.Count()
,SQL将只执行计数操作,而不是返回整个表。