寫一個針對IQueryable 的擴展方法支持動態排序


 

所謂的動態排序是指支持任意字段、任意升序降序的排序。我們希望在客戶端按如下格式寫:

localhost:8000/api/items?sort=title
localhost:8000/api/items?sort=name,title
localhost:8000/api/items?sort=-name,title

字段前面加-表示降序,否則是升序。

接下來要做的就是解析查詢字符串中的字段,組成排序的表達式樹作為OrderBy方法的實參。

首先安裝如下:

install-package system.linq.dynamic

寫一個針對IQueryable<T>,返回IQueryable<T>類型的擴展方法:

 

using System.Linq.Dynamic;

public static class IQueryableExtensions
{
    public static IQueryable<T> ApplySort<T>(this IQueryable<T> source, string sort)
    {
        if(source == null)
        {
            throw new ArgumentNullException("source");
        }
        
        if(sort == null)
        {
            return source;
        }
        
        //把以逗號分隔的排序字符串放數組中
        var listSort = sort.Split(',');
        
        string completeSortExpression = "";
        foreach(var sortOption in listSort)
        {
            //如果排序字段以-開頭就降序,否則升序
            if(sortOption.StartsWith("-"))
            {
                completeSortExpression = sortOption.Remove(0, 1) + " descending,";
            }
            else
            {
                completeSortExpression = completeSortExpression + sortOption + ",";
            }
        }
        
        if(!string.IsNullOrWhiteSpace(completeSortExpression))
        {
            source = source.OrderBy(completeSortExpression
                .Remove(completeSortExpression.Count()-1));
        }
        
        return sort;
    }
}

 

在controller下的action中,大致這樣使用:

 

public IHttpActionResult Get(string sort="id")
{
    try
    {
        var items = _repo.GetItems();
        
        var result = items
            .ApplySort(sort)
            .ToList()
            .Select(e => ItemFactory.ConvertToViewModel(e));
        
        return OK(result);
    }
    catch(Exception)
    {
        //TODO:處理異常
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM