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:处理异常
        }
    }
  • 相关阅读:
    ESFramework Demo -- 动态组及群聊Demo(附源码)
    反射整理学习
    JavaScript 每周导读
    SQLSERVER 中的 with锁级别
    代码细节重构:请对我的代码指手划脚
    SQLServer查询死锁语句
    模块加载系统 v16
    数据结构之排序算法C#实现
    浅谈操作系统对内存的管理
    如何编写可维护的面向对象JavaScript代码
  • 原文地址:https://www.cnblogs.com/darrenji/p/5148296.html
Copyright © 2011-2022 走看看