对多个条件进行逻辑排序以对最终结果排序的问题



我有一个网格,其中显示了特定部门的代理列表。这些中介是发布房屋出租列表的房地产中介。

网格显示AgentNameNumberofActiveListingsNumberofSoldAndExpiredListings等基本信息

现在的要求是默认情况下网格中的列表应该根据活动列表按降序排序(NumberofActiveListings)。如果多个代理具有相同数量的活动列表,则按NumberofSoldAndExpiredListings降序对代理列表进行排序。如果多个agent有相同数量的NumberofActiveListingsNumberofSoldAndExpiredListings,则agent list按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升序排序。

有谁能指导我按逻辑顺序实现这个要求吗?

对于按多列排序,请查看与初始的。orderby()和。orderbydescent()一起工作的。thenby()和。thenbydescent()函数。

至于动态选择要排序的列,请查看IEnumerable/IQueryable.

主要有两种方法

  1. 使用反射(如果列表很大则很慢)
agents =  agents.OrderBy(o => o.GetType()
.GetProperty(model.SortingColumn)
.GetValue(o, null)).ToList();
  1. 这是更快,但你需要使用特殊功能
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();
}

相关内容

  • 没有找到相关文章

最新更新