2010-10-15 15 views
8

मैं एक विधिइकाई फ्रेमवर्क के साथ ग्रिडव्यू सॉर्टिंग।

private void BindGrid() 
{ 
    dataContext = new VTCEntities(); 
    string SortExpression = "DisplayName"; 
    string SortDirection = "ASC"; 
    int skip = 0; 

    if (this.ViewState["SortExp"] != null) 
    { 
     SortExpression = this.ViewState["SortExp"].ToString(); 
    } 

    if (this.ViewState["SortOrder"] != null) 
    { 
     string d = this.ViewState["SortOrder"].ToString(); 
     if (d == "ASC") 
     { 
      SortDirection = "ASC"; 
     } 
     else 
     { 
      SortDirection = "DESC"; 
     } 
    } 

    if (CurrentPage != 0) 
    { 
     skip = CurrentPage * PageSize; 
    } 

    if (SortDirection == "ASC") 
    { 
     this.grdCustomers.DataSource = dataContext.CustomerSet.OrderBy(i => i.DisplayName).Skip(skip).Take(PageSize); 
    } 
    else 
    { 
     this.grdCustomers.DataSource = dataContext.CustomerSet.OrderByDescending(i => i.DisplayName).Skip(skip).Take(PageSize); 
    } 

    this.grdCustomers.DataBind(); 
} 

है और यह गंध, बुरा शुरू कर रहा है। मेरे पास 4 कॉलम हैं जिन्हें मुझे सॉर्ट करना है। मैं ग्राहक स्विच पर कौन सी संपत्ति ऑर्डर करने का प्रयास कर रहा हूं यह निर्धारित करने के लिए स्विच या कुछ करने से बचना चाहता हूं। सॉर्टएक्सप्रेस, जो स्ट्रिंग है, मेरे ग्राहकसेट ऑब्जेक्ट्स में से किसी एक पर संपत्ति के लिए एक बेहतर प्रोग्रामर क्या करेगा?

हमेशा के रूप में धन्यवाद।
जिम

उत्तर

10

मैं अतीत में इस के लिए इस विस्तार पद्धति का उपयोग किया:

public static class QueryExtensions { 
    public static IQueryable<T> SortBy<T>(this IQueryable<T> source, string propertyName) { 
     if (source == null) { 
      throw new ArgumentNullException("source"); 
     } 

     // DataSource control passes the sort parameter with a direction 
     // if the direction is descending   
     int descIndex = propertyName.IndexOf(" DESC"); 

     if (descIndex >= 0) { 
      propertyName = propertyName.Substring(0, descIndex).Trim(); 
     } 

     if (String.IsNullOrEmpty(propertyName)) { 
      return source; 
     } 

     ParameterExpression parameter = Expression.Parameter(source.ElementType, String.Empty); 
     MemberExpression property = Expression.Property(parameter, propertyName); 
     LambdaExpression lambda = Expression.Lambda(property, parameter); 

     string methodName = (descIndex < 0) ? "OrderBy" : "OrderByDescending"; 

     Expression methodCallExpression = Expression.Call(typeof(Queryable), methodName, 
              new Type[] { source.ElementType, property.Type }, 
              source.Expression, Expression.Quote(lambda)); 

     return source.Provider.CreateQuery<T>(methodCallExpression); 
    } 
} 

स्रोत: http://weblogs.asp.net/davidfowler/archive/2008/12/11/dynamic-sorting-with-linq.aspx

तो फिर तुम इस पुनर्लेखन कर सकते हैं:

 if (SortDirection == "ASC") 
     { 
      this.grdCustomers.DataSource = dataContext.CustomerSet.OrderBy(i => i.DisplayName).Skip(skip).Take(PageSize); 
     } 
     else 
     { 
      this.grdCustomers.DataSource = dataContext.CustomerSet.OrderByDescending(i => i.DisplayName).Skip(skip).Take(PageSize); 
     } 

को
this.grdCustomers.DataSource = dataContext.CustomerSet.SortBy("DisplayName DESC").Skip(skip).Take(PageSize); 
+3

बेंडवे, आप इतने पैसे हैं कि आप यह भी नहीं जानते कि आप कितने पैसे हैं ... सही दिशा में धक्का के लिए एक गुच्छा धन्यवाद। – jim

+0

यह एक अच्छा समाधान है। धन्यवाद। –

संबंधित मुद्दे