1

我想使用MVC網格過濾但不想使用linq。當前的例子使用linq來完成過濾。但是,我想將篩選選項傳遞給存儲過程。你有一個例子嗎?獲取分頁,從Telerik擴展網格過濾並傳遞到存儲過程

我見過Telerik擴展網格的例子,裏面的控制器在使用GridActionAttribute和GridModel接收到數據庫中的所有記錄之後過濾記錄。

[GridAction] 
    public ActionResult _Paging() 
    { 
     return View(new GridModel<Order> 
     { 
      Data = GetOrders() 
     }); 
    } 

我想要這個過濾器,執行數據庫查詢之前的分頁信息。這樣我就只能從數據庫中獲取pagesize記錄。沒有整個數據庫記錄來過濾它(使用storedproc)。 另外,從數據庫LINQ或ENTLIB DAL獲取記錄的最佳做法是什麼。

回答

9

我爲此得到了解決方案。 這裏是我的助手類,它爲我構建過濾器查詢。

using Telerik.Web.Mvc; 

/// <summary> 
/// TODO: Update summary. 
/// </summary> 
public class GridBinder 
{ 
    public int PageNumber 
    { 
     get { return _pageNumber; } 
     set { _pageNumber = value; } 
    } 

    public int PageSize 
    { 
     get { return _pageSize; } 
     set { _pageSize = value; } 
    } 

    public int RecordCount { get; set; } 

    public SortInfo SortInfo 
    { 
     get { return _sortInfo; } 
     set { _sortInfo = value; } 
    } 

    private readonly GridCommand _command; 
    private int _pageNumber = 1; 
    private int _pageSize = 10; 
    private SortInfo _sortInfo = new SortInfo() { Direction = SortDirection.Asc, Member = string.Empty }; 

    public GridBinder(GridCommand command) 
    { 
     this._command = command; 
     GetSortDescriptor(); 
    } 

    private void GetSortDescriptor() 
    { 
     SortInfo sortInfo; 
     foreach (SortDescriptor descriptor in this._command.SortDescriptors) 
     { 
      this.SortInfo.Member = descriptor.Member; 
      this.SortInfo.Direction = descriptor.SortDirection == ListSortDirection.Ascending ? SortDirection.Asc : SortDirection.Desc; 
     } 
    } 

    public string GetFilterDescriptor() 
    { 
     string filters = string.Empty; 
     foreach (IFilterDescriptor filter in this._command.FilterDescriptors) 
     { 
      filters += ApplyFilter(filter); 
     } 

     return filters; 
    } 

    private static string ApplyFilter(IFilterDescriptor filter) 
    { 
     var filters = string.Empty; 
     if (filter is CompositeFilterDescriptor) 
     { 
      filters += "("; 
      var compositeFilterDescriptor = (CompositeFilterDescriptor)filter; 
      foreach (IFilterDescriptor childFilter in compositeFilterDescriptor.FilterDescriptors) 
      { 
       filters += ApplyFilter(childFilter); 
       filters += " " + compositeFilterDescriptor.LogicalOperator.ToString() + " "; 
      } 
     } 
     else 
     { 
      string filterDescriptor = "{0} {1} {2}"; 
      var descriptor = (FilterDescriptor)filter; 
      if (descriptor.Operator == FilterOperator.StartsWith) 
      { 
       filterDescriptor = string.Format(filterDescriptor, descriptor.Member, "LIKE", "'" + descriptor.Value + "%'"); 
      } 
      else if (descriptor.Operator == FilterOperator.EndsWith) 
      { 
       filterDescriptor = string.Format(filterDescriptor, descriptor.Member, "LIKE", "'%" + descriptor.Value + "'"); 
      } 
      else if (descriptor.Operator == FilterOperator.Contains) 
      { 
       filterDescriptor = string.Format(filterDescriptor, descriptor.Member, "LIKE", "'%" + descriptor.Value + "%'"); 
      } 
      else if (descriptor.Operator == FilterOperator.DoesNotContain) 
      { 
       filterDescriptor = string.Format(filterDescriptor, descriptor.Member, "NOT LIKE", "'%" + descriptor.Value + "%'"); 
      } 
      else if (descriptor.Operator == FilterOperator.IsEqualTo) 
      { 
       filterDescriptor = string.Format(filterDescriptor, descriptor.Member, "=", "'" + descriptor.Value + "'"); 
      } 
      else if (descriptor.Operator == FilterOperator.IsNotEqualTo) 
      { 
       filterDescriptor = string.Format(filterDescriptor, descriptor.Member, "<>", "'" + descriptor.Value + "'"); 
      } 
      else if (descriptor.Operator == FilterOperator.IsGreaterThan) 
      { 
       filterDescriptor = string.Format(filterDescriptor, descriptor.Member, ">", "'" + descriptor.Value + "'"); 
      } 
      else if (descriptor.Operator == FilterOperator.IsGreaterThanOrEqualTo) 
      { 
       filterDescriptor = string.Format(filterDescriptor, descriptor.Member, ">=", "'" + descriptor.Value + "'"); 
      } 
      else if (descriptor.Operator == FilterOperator.IsLessThan) 
      { 
       filterDescriptor = string.Format(filterDescriptor, descriptor.Member, "<", "'" + descriptor.Value + "'"); 
      } 
      else if (descriptor.Operator == FilterOperator.IsLessThanOrEqualTo) 
      { 
       filterDescriptor = string.Format(filterDescriptor, descriptor.Member, "<=", "'" + descriptor.Value + "'"); 
      } 

      filters = filterDescriptor; 
     } 

     filters = filters.EndsWith("And ") == true ? filters.Substring(0, filters.Length - 4) + ")" : filters; 
     filters = filters.EndsWith("Or ") == true ? filters.Substring(0, filters.Length - 4) + ")" : filters; 

     return filters; 
    } 
} 
public class SortInfo 
{ 
    public string Member { get; set; } 
    public SortDirection Direction { get; set; } 
} 

public enum SortDirection 
{ 
    Asc, Desc 
} 

而我只是稱這種方法對我來說工作得很好。我沒有測試datetime列。

0

考慮使用自定義Ajax綁定。檢查這個part of the documentation和演示來獲得這個想法。

+0

GridCommand將爲您提供所有過濾器,分類和分頁信息。因爲它需要[GridAction(EnableCustomBinding = true)]屬性。 –

+0

沒有存儲過程用於過濾的完整示例。 –