2010-10-15 19 views
8

tengo un métodoClasificación de Gridview con Entity Framework.

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

y está empezando a oler, malo. Tengo 4 columnas que tengo que ordenar. Me gustaría evitar hacer un cambio o algo para determinar qué propiedad en el CustomerSet estoy tratando de ordenar. ¿Qué haría un mejor programador para asociar SortExpression, que es una cadena, a la propiedad en uno de mis objetos CustomerSet?

Gracias como siempre.
Jim

Respuesta

10

He utilizado este método de extensión para esto en el pasado:

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

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

A continuación, puede volver a escribir esto:

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

a

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

bendewey, usted es tan dinero que ni siquiera sabe cómo es el dinero que usted es ... muchas gracias por el empuje en la dirección correcta. – jim

+0

esa es una gran solución. Gracias. –