服务器过滤kendo网格中的内存不足异常

时间:2016-11-02 06:11:02

标签: c# asp.net kendo-grid

我想使用skip和take服务器分页和过滤解决方案在kendo网格中显示大数据。我的控制器和方法是:

public ActionResult LoadStudents(int page, int pageSize, int take, bool? activeOnly)
    {
        var sorterCollection = KendoGridSorterCollection.BuildCollection(Request);
        var filterCollection = KendoGridFilterCollection.BuildCollection(Request);

        ...

        LogUI.Data.kiwiEntities en = new Data.kiwiEntities();

        var result = en.Syslogds.Where(s => el.Contains(s.MsgHostAddress)
                           && op.Contains(s.MsgCustom04.Trim()));
        var filteredStudents = result.MultipleFilter(filterCollection.Filters);
        int coun = filteredStudents.Count();
        var pagedData = filteredStudents.OrderBy(t => t.MsgDateTime).Skip((page-1) * pageSize).Take(pageSize);
        var pagedDataList = pagedData.ToList();
        var jsonData = new { total = coun, pagedDataList };
        return Json(jsonData, JsonRequestBehavior.AllowGet);
    }

和我的MultipleFilter方法是:

public static IQueryable<T> MultipleFilter<T>(this IQueryable<T> data,
      List<KendoGridFilter> filterExpressions)
    {
        if ((filterExpressions == null) || (filterExpressions.Count <= 0))
        {
            return data;
        }

        IQueryable<T> filteredquery = from item in data select item;

        for (int i = 0; i < filterExpressions.Count; i++ )
        {
            var index = i;

            Func<T, bool> expression = item =>
                {
                    var filter = filterExpressions[index];
                    var itemValue = item.GetType()
                        .GetProperty(filter.Field)
                        .GetValue(item, null);

                    if (itemValue == null)
                    {
                        return false;
                    }

                    var value = filter.Value;
                    switch (filter.Operator)
                    {
                        case "eq":
                            return itemValue.ToString() == value;
                        case "startswith":
                            return itemValue.ToString().StartsWith(value);
                        case "contains":
                            return itemValue.ToString().Contains(value);
                        case "endswith":
                            return itemValue.ToString().EndsWith(value);
                    }

                    return true;
                };

            filteredquery = filteredquery.Where(expression).AsQueryable();
        }
        return filteredquery;
    }

每件事都没问题但是当我在我的剑道网格中使用过滤器时,我在filteredStudents变量中有一个内存不足的例外。

1 个答案:

答案 0 :(得分:0)

您可以在Kendo UI forum找到一个示例。 以下是该页面的示例,以便您了解该方法的工作原理:

 public ActionResult Products_Read([DataSourceRequest]DataSourceRequest request)
    {
        using (var northwind = new NorthwindEntities())
        {
            IQueryable<Product> products = northwind.Products;
            //Convert the Product entities to ProductViewModel instances.
            DataSourceResult result = products.ToDataSourceResult(request, product => new ProductViewModel
                    {
                    ProductID = product.ProductID,
                    ProductName = product.ProductName,
                    UnitsInStock = product.UnitsInStock
                    });
            return Json(result);
        }
    }