jquery数据表服务器端过滤导致EF超时

本文关键字:EF 超时 过滤 数据表 服务器端 jquery | 更新日期: 2023-09-27 18:20:54

我有下面的方法,它过滤了200万条记录,但大多数时候,如果我想获得最后一页,它会导致实体框架超时。有什么方法可以改进下面的代码,使其运行得更快吗。

 public virtual ActionResult GetData(DataTablesParamsModel param)
        {
            try
            {
                int totalRowCount = 0;
                // Generate Data
                var allRecords = _echoMediaRepository.GetMediaList();
                //Apply search criteria to data
                var predicate = PredicateBuilder.True<MediaChannelModel>();
                if (!String.IsNullOrEmpty(param.sSearch))
                {
                    var wherePredicate = PredicateBuilder.False<MediaChannelModel>();
                    int i;
                    if (int.TryParse(param.sSearch, out i))
                    {
                        wherePredicate = wherePredicate.Or(m => m.ID == i);
                    }
                    wherePredicate = wherePredicate.Or(m => m.Name.Contains(param.sSearch));
                    predicate = predicate.And(wherePredicate);
                }
                if (param.iMediaGroupID > 0)
                {
                    var wherePredicate = PredicateBuilder.False<MediaChannelModel>();
                    var mediaTypes = new NeptuneRepository<Lookup_MediaTypes>();
                    var mediaGroups = mediaTypes.FindWhere(m => m.MediaGroupID == param.iMediaGroupID)
                    .Select(m => m.Name)
                    .ToArray();
                    wherePredicate = wherePredicate.Or(m => mediaGroups.Contains(m.NeptuneMediaType) || mediaGroups.Contains(m.MediaType));
                    predicate = predicate.And(wherePredicate);
                }
                var filteredRecord = allRecords.Where(predicate);
                var columnCriteria = param.sColumns.Split(',').ToList();
                if (!String.IsNullOrEmpty(columnCriteria[param.iSortCol_0]))
                {
                    filteredRecord = filteredRecord.ApplyOrder(
                        columnCriteria[param.iSortCol_0],
                        param.sSortDir_0 == "asc" ? QuerySortOrder.OrderBy : QuerySortOrder.OrderByDescending);
                }
                totalRowCount = filteredRecord.Count();
                var finalQuery = filteredRecord.Skip(param.iDisplayStart).Take(param.iDisplayLength).ToList();
                // Create response
                return Json(new
                {
                    sEcho = param.sEcho,
                    aaData = finalQuery,
                    iTotalRecords = allRecords.Count(),
                    iTotalDisplayRecords = totalRowCount
                }, JsonRequestBehavior.AllowGet);
            }
            catch (Exception ex)
            {
                Logger.Error(ex);
                throw;
            }
        }

jquery数据表服务器端过滤导致EF超时

您的代码和查询看起来已经优化,所以问题应该是数据库中缺少索引,这会降低orderby(由跳过使用)的性能。

使用与您的测试代码非常相似的测试代码,我在一个本地测试数据库中进行了一些测试,该数据库中有一个500万行的表(所有XML类型列都已填充),正如预期的那样,使用按索引排序的查询非常快,但对于未索引的列,它们可能需要非常、非常、长的时间。

我建议您分析动态Where和Order函数最常用的列,并通过创建相应的索引来进行一些性能测试。