iT邦幫忙

0

如何在OrderBy中,使用動態欄位。

WM 2019-10-05 00:41:33222 瀏覽

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


尚未有邦友留言

立即登入留言