2016-11-02 5 views
0

私は剣道グリッドにスキップを使用して大きなデータを表示し、サーバーのページングとフィルタリングのためのソリューションを取りたいと考えています。サーバーのフィルタリング剣道グリッドでのメモリ不足例外

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; 
    } 

すべてのものはOKですが、私は私の剣道グリッドにフィルタを使用するとき、私はfilteredStudents変数にメモリ例外のうちを持っています。

+0

達成しようとしているフィルタはありますか? –

+0

すべてのフィルタ。 itemvalue.tostring()== value – behzad

+0

'ToDataSourceResult()'拡張メソッドを使用している場合、剣道はこれを自動的に行うことができます。あなたはそれを試しましたか? –

答えて

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); 
     } 
    }