我有一個網格,我在其中顯示特定部門的代理串列。這些代理是發布房屋出租清單的房地產代理。
網格顯示基本資訊,如AgentName,NumberofActiveListings,NumberofSoldAndExpiredListings等。
現在的要求是默認情況下,網格中的串列應根據活動串列按降序排列(NumberofActiveListings)。如果多個代理具有相同數量的活動串列,則按NumberofSoldAndExpiredListings降序對代理串列進行排序。如果多個代理的數量相同NumberofActiveListings,NumberofSoldAndExpiredListings則代理串列應按Name升序排序。
此外,用戶可以單擊網格上的單個列,資料將根據該列進行排序。
下面是保存最終結果的 DTO 類:
public class AgentResultDto
{
public int AgentId { get; set; }
public string AgentName { get; set; }
public int NumberofActiveListings { get; set; }
public int NumberofSoldAndExpiredListings { get; set; }
}
public class GridviewInput
{
public string SortingColumn { get; set; } //hold the column name user will click on to sort the data
//other params
}
public virtual async Task<AgentResultDto> GetAgents(GridviewInput model)
{
List<AgentResultDto> agents = new List<AgentResultDto>();
//logic to populate agent list
agents = agents.OrderBy(model.SortingColumn).ToList();
}
但在這里我很困惑如何指定條件,如果 NumberofActiveListings 相同則按順序排序NumberofSoldAndExpiredListings,如果NumberofSoldAndExpiredListings相同則按AgentName升序排序。
任何人都可以指導我按邏輯順序執行此要求嗎?
uj5u.com熱心網友回復:
至于按多列排序,請查看與初始 .OrderBy() 和 .OrderByDescending() 結合使用的 .ThenBy() 和 .ThenByDescending() 函式。
至于動態選擇要排序的列,請查看IEnumerable<T> / IQueryable<T> 上的 Dynamic LINQ OrderBy。
uj5u.com熱心網友回復:
主要有2種方式
- 使用反射(如果串列很大,則慢)
agents = agents.OrderBy(o => o.GetType()
.GetProperty(model.SortingColumn)
.GetValue(o, null)).ToList();
- 這更快,但您需要使用特殊功能
var columnGetter = CreateGetter(quotes[0].GetType(), model.SortingColumn);
quotes = quotes .OrderBy(o => columnGetter(o)).ToList();
public static Func<object, object> CreateGetter(Type runtimeType, string propertyName)
{
var propertyInfo = runtimeType.GetProperty(propertyName);
var obj = Expression.Parameter(typeof(object), "obj");
var objT = Expression.TypeAs(obj, runtimeType);
var property = Expression.Property(objT, propertyInfo);
var convert = Expression.TypeAs(property, typeof(object));
return (Func<object, object>)Expression.Lambda(convert, obj).Compile();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/339813.html
