我有一个方法
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对象上的属性相关联会做什么?
一如既往地谢谢 吉姆
答案 0 :(得分:12)
我过去曾使用过这种扩展方法:
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);