【问题标题】:Sorting Gridview with Entity Framework.使用实体框架对 Gridview 进行排序。
【发布时间】:2010-10-15 19:55:57
【问题描述】:

我有办法

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 对象之一的属性?

一如既往的感谢。
吉姆

【问题讨论】:

    标签: asp.net entity-framework gridview


    【解决方案1】:

    我过去曾为此使用过这种扩展方法:

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

    【讨论】:

    • bendewey,你太有钱了,你甚至不知道你有多少钱......感谢一群人朝着正确的方向前进。
    • 这是一个很好的解决方案。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-13
    • 1970-01-01
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多