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