• 写一个针对IQueryable<T>的扩展方法支持动态排序


    所谓的动态排序是指支持任意字段、任意升序降序的排序。我们希望在客户端按如下格式写:

    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:处理异常
        }
    }
  • 相关阅读:
    两排滚动js
    弹性布局
    channelartlist添加栏目链接
    首页调取二级、三级栏目
    dede完美分页样式
    如何安装sass
    首页分页(自由列表)
    tag标签调取
    25.简单的路由
    24.简单的自定义服务
  • 原文地址:https://www.cnblogs.com/darrenji/p/5148296.html
Copyright © 2020-2023  润新知