Jquery Datatable服务器端排序和筛选性能
如何提高数据表服务器端处理中的排序和筛选性能 我有100K条记录,在下面的示例中,我只显示了2列,但有25列 这是我的密码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
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将只执行计数操作,而不是返回整个表。