以下是一段完整的处理分页和排序的Action。
public IActionResult GetValues(PageSortDTO pageSortDTO) { var data = db.Landmarks.AsQueryable(); var totalConut = data.Count(); if (!string.IsNullOrEmpty(pageSortDTO.SortKey)) { if (pageSortDTO.Direction == "asc") { if (pageSortDTO.SortKey == "Id") { data = data.OrderBy(e => e.Id); } else if (pageSortDTO.SortKey == "Name") { data = data.OrderBy(e => e.Name); } } else { if (pageSortDTO.SortKey == "Id") { data = data.OrderBy(e => e.Id); } else if (pageSortDTO.SortKey == "Name") { data = data.OrderBy(e => e.Name); } } } var pagedData = data .Skip(pageSortDTO.PageSize * pageSortDTO.PageIndex) .Take(pageSortDTO.PageSize).ToList(); return Ok(new { Values = pagedData, TotalCount = totalConut });
PageSortDTO中的属性值:
public int PageIndex { get; set; } //第几页public int PageSize { get; set; } //一页有几笔资料public string SortKey { get; set; } //要排序的栏位public string Direction { get; set; } //降幂或升幂
这几段处理排序的程式码比较不漂亮的地方在于,必须依照排序的栏位写if else判断式,若栏位一多,整段程式码将会又臭又长。
这时我们可以将if (!string.IsNullOrEmpty(pageSortDTO.SortKey))判断式的内容改写成:
var param = pageSortDTO.SortKey;var propertyInfo = typeof(Landmark).GetProperty(param);if (pageSortDTO.Direction == "asc"){ data = data.OrderBy(e => propertyInfo.GetValue(e, null));}else if (pageSortDTO.Direction == "desc"){ data = data.OrderByDescending(e => propertyInfo.GetValue(e, null));}
完成OrderBy动态栏位排序。