故事:业务需求上需要根据用户选定的排序规则,进行业务数据表的多列动态排序
实现方式:
1 定义优先枚举信息
public enum RuleEnum
{
[Description("列01")]
Col01= 1,
[Description("列02")]
Col02= 2,
[Description("列03")]
Col03= 3,
[Description("列04")]
Col04 = 4,
}
2 定义动态排序的数组
public class OptionClickStreamRowDto
{
/// <summary>
/// 序号
/// </summary>
public int Ordinal { get; set; }
/// <summary>
/// 规则ID
/// </summary>
public RuleEnum Rule { get; set; }
/// <summary>
/// 规则描述
/// </summary>
public string RuleDesc { get; set; }
/// <summary>
/// 排序规则
/// </summary>
public string Sort { get; set; } = "ASC";
}
3 引用System.Linq.Dynamic.Core
4 写排序方法
/// <summary>
/// 动态排序
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="list">原集合</param>
/// <param name="sorts">排序字符串"a desc,b asc,c asc"</param>
/// <returns></returns>
public static List<T> DynamicSort<T>(List<T> list, string sorts)
{
return list.AsQueryable().OrderBy(sorts).ToList();
}
5 准备调用处
//声明排序
var options =new List<OptionClickStreamRowDto>();
//添加排序信息
options.add(new OptionClickStreamRowDto()
{
Ordinal = 1,
Rule = RuleEnum.Col1
});
options.add(new OptionClickStreamRowDto()
{
Ordinal = 2,
Rule = RuleEnum.Col3,
Sort = "Descending"
});
//获取排序规则字符串
string fieldsToSort = "";
//拼接排序字段
options.ForEach(x =>
{
switch (x.Rule)
{
case RuleEnum.Col01 :
fieldsToSort += $",Col01 {x.Sort}";
break;
case RuleEnum.Col02:
fieldsToSort += $",Col02 {x.Sort}";
break;
case RuleEnum.Col03:
fieldsToSort += $",Col03 {x.Sort}";
break;
case RuleEnum.Col04:
fieldsToSort += $",Col04 {x.Sort}";
break;
}
});
fieldsToSort = fieldsToSort.Substring(1, fieldsToSort.Length - 1);
//调用排序方法
queryDataList = DynamicSort(queryDataList, fieldsToSort);