IQueryableについて書きます<br>の拡張メソッドは動的ソートをサポートします

3426 ワード


動的ソートとは、任意のフィールド、任意の昇順降順をサポートするソートです.クライアントには、localhost:8000/api/itemsというフォーマットで書きたいと思います.sort=titlelocalhost:8000/api/items?sort=name,titlelocalhost:8000/api/items?sort=-name、titleフィールドの前に-を付けて降順を表し、そうでない場合は昇順です.次に、クエリ文字列のフィールドを解析し、OrderByメソッドの実パラメータとしてソートを構成する式ツリーを作成します.まず、install-package systemをインストール.linq.dynamicは、IQueryableに対して、IQueryableタイプの拡張メソッドを返します.
 
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;
    }
}

 
コントロール下の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:    
    }
}