1)安装System.Linq.Dynamic
2)添加以下代码
public static class OrderUtils
{
public static string ToStringForOrdering<T, TKey>(this Expression<Func<T, TKey>> expression, bool isDesc = false)
{
var str = expression.Body.ToString();
var param = expression.Parameters.First().Name;
str = str.Replace("Convert(", "(").Replace(param + ".", "");
return str + (isDesc ? " descending" : "");
}
}
3)撰写您的开关lambda函数
public static class SortHelper
{
public static Expression<Func<UserApp, object>> UserApp(string orderProperty)
{
orderProperty = orderProperty?.ToLowerInvariant();
switch (orderProperty)
{
case "firstname":
return x => x.PersonalInfo.FirstName;
case "lastname":
return x => x.PersonalInfo.LastName;
case "fullname":
return x => x.PersonalInfo.FirstName + x.PersonalInfo.LastName;
case "email":
return x => x.Email;
}
}
}
4的选择)使用你的助手
Dbset.OrderBy(SortHelper.UserApp("firstname").ToStringForOrdering())
5)您可以用pagging(PagedList)
public virtual IPagedList<T> GetPage<TOrder>(Page page, Expression<Func<T, bool>> where, Expression<Func<T, TOrder>> order, bool isDesc = false,
params Expression<Func<T, object>>[] includes)
{
var orderedQueryable = Dbset.OrderBy(order.ToStringForOrdering(isDesc));
var query = orderedQueryable.Where(where).GetPage(page);
query = AppendIncludes(query, includes);
var results = query.ToList();
var total = Dbset.Count(where);
return new StaticPagedList<T>(results, page.PageNumber, page.PageSize, total);
}
说明使用
System.Linq.Dynamic使我们能够在排序依据的方法设置字符串值。但是在这个扩展中,字符串将被解析为Lambda。所以我认为它会工作,如果我们将解析Lambda字符串并将其提供给OrderBy方法。它的工作原理!
你可能会寻找Dynamic Linq:http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx – BrokenGlass
@Nev_Rahd:试图澄清这个问题。另外,'OrderBy'是一个Linq特性,并且在'IEnumerable'上,而不是'List'特有的特性。随意滚动编辑或进一步更改:) –
[动态LINQ OrderBy在IEnumerable](http:// stackoverflow。com/questions/41244/dynamic-linq-orderby-on-ienumerablet) –