zoukankan      html  css  js  c++  java
  • 写一个针对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:处理异常
        }
    }
  • 相关阅读:
    Python进阶-数据库操作
    Python进阶-数据库(MySQL)介绍与基本操作
    Python进阶-网络编程之TCP粘包
    表与表之间的关系
    基本数据类型
    mysql
    io模型
    GIL,线程池与进程池
    线程
    并发编程,进程
  • 原文地址:https://www.cnblogs.com/darrenji/p/5148296.html
Copyright © 2011-2022 走看看