Tri de Gridview avec Entity Framework.

asp.net entity-framework gridview

Question

J'ai une méthode

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

et ça commence à sentir mauvais. J'ai 4 colonnes sur lesquelles je dois trier. J'aimerais éviter de faire un changement ou quelque chose pour déterminer quelle propriété sur le CustomerSet j'essaie de commander. Que ferait un meilleur programmeur pour associer la SortExpression, qui est une chaîne, à la propriété de l’un de mes objets CustomerSet?

Merci comme toujours.
Jim

Réponse acceptée

J'ai utilisé cette méthode d'extension pour cela dans le passé:

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

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

Ensuite, vous pouvez réécrire ceci:

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


Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow