1) Cài đặt System.Linq.Dynamic
2) Thêm đoạn mã sau
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) Viết chuyển đổi của bạn để lựa chọn của Lambda chức năng
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) Sử dụng người giúp đỡ của bạn
Dbset.OrderBy(SortHelper.UserApp("firstname").ToStringForOrdering())
5) Bạn có thể sử dụng nó với 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);
}
Giải thích
System.Linq.Dynamic cho phép chúng ta thiết lập giá trị chuỗi trong phương pháp OrderBy. Nhưng bên trong phần mở rộng này, chuỗi sẽ được phân tích cú pháp thành Lambda. Vì vậy, tôi nghĩ rằng nó sẽ làm việc nếu chúng ta sẽ phân tích Lambda thành chuỗi và đưa nó vào phương thức OrderBy. Và nó hoạt động!
Bạn có thể tìm kiếm LINQ động: http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx – BrokenGlass
@Nev_Rahd: Đã cố gắng làm rõ câu hỏi một chút. Ngoài ra, 'OrderBy' là một tính năng LINQ, và là trên' IEnumerable', không phải là một tính năng cụ thể cho 'List'. Vui lòng cuộn lại bản chỉnh sửa hoặc thay đổi thêm :) –
Bản sao có thể có của [Thứ tự LINQ động trên IEnumerable] (http: // stackoverflow.com/questions/41244/dynamic-linq-orderby-on-ienumerablet) –