以下是一段完整的處理分頁和排序的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動態欄位排序。