2010-10-15 26 views
8

Bir yönteminiGridview'ı Varlık Çerçevesi ile Sıralama.

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

var ve kötü koku başladı. Sıralamak zorunda olduğum 4 sütun var. Sipariş vermeye çalıştığım CustomerSet'te hangi özelliği saptamaktan kaçınmak isterim. Daha iyi bir programcı, bir String olan SortExpression'u, CustomerSet nesnelerimden birinde mülke ilişkilendirmek için ne yapardı?

Her zamanki gibi teşekkürler.
Jim

Geçmişte bunun için bu uzantı yöntemi kullandım

cevap

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

Kaynak: http://weblogs.asp.net/davidfowler/archive/2008/12/11/dynamic-sorting-with-linq.aspx

Sonra bu yeniden yazabilirsiniz:

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

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

bendewey, ne kadar para olduğunu bile bilmediğin için çok paran var ... sağa doğru itmek için bir demet teşekkürler. – jim

+0

bu harika bir çözüm. Teşekkürler. –