代码之家  ›  专栏  ›  技术社区  ›  jim

使用实体框架对Gridview排序。

  •  9
  • jim  · 技术社区  · 16 年前

    我有办法

    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列需要排序。我想避免做开关或其他事情来确定我要订购的CustomerSet上的哪个属性。一个更好的程序员如何将SortExpression(一个字符串)与我的一个CustomerSet对象上的属性相关联?


    吉姆

    1 回复  |  直到 9 年前
        1
  •  12
  •   bendewey    16 年前

    我以前用过这种扩展方法:

    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);
    
    推荐文章