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
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:
}
}