写一个针对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(, ) + " descending,";
}
else
{
completeSortExpression = completeSortExpression + sortOption + ",";
}
} if(!string.IsNullOrWhiteSpace(completeSortExpression))
{
source = source.OrderBy(completeSortExpression
.Remove(completeSortExpression.Count()-));
} 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:处理异常
}
}
写一个针对IQueryable<T>的扩展方法支持动态排序的更多相关文章
- 通过写一个Demo展示C#中多种常用的集合排序方法
不多说,程序很简单,就是将集合中的数据进行排序,但使用到的知识点还是比较多的,大牛勿喷,谨献给初学者!直接上程序吧! namespace Demo { /// <summary> /// ...
- 写一个简单易用可扩展vue表单验证插件(vue-validate-easy)
写一个vue表单验证插件(vue-validate-easy) 需求 目标:简单易用可扩展 如何简单 开发者要做的 写了一个表单,指定一个name,指定其验证规则. 调用提交表单方法,可以获取验证成功 ...
- 一个通用的DataGridView导出Excel扩展方法(支持列数据格式化)
假如数据库表中某个字段存放的值“1”和“0”分别代表“是”和“否”,要在DataGridView中显示“是”和“否”,一般用两种方法,一种是在sql中直接判断获取,另一种是在DataGridView的 ...
- 自己写一个与startWith类似的判断方法
package com.hanqi.lianxi; import java.util.Scanner; public class startWith { //自己顶一个与startWit ...
- 写一个xml文件到磁盘的方法
/** * 往磁盘上写一个xml文件 * * <?xml version="1.0" encoding="UTF-8" standalone=" ...
- vue : 在vuex里写一个数组首尾元素互换的方法
不着急上代码,先想几个问题. vuex里怎么写方法? mutation里写vuex方法,组件中用commit调用. 数组首尾元素怎么互换? arr.splice(0, 0, arr[arr.lengt ...
- System.Web.Mvc.HtmlHelper<dynamic>”没有名为“Partial”的适用方法,但似乎有一个具有该名称的扩展方法。扩展方法不能进行动态调度。请考虑强制转换动态参数,或调用该扩展方法但不使用扩展方法语法。
MVC 调用分布式图,传了没有定义的参数,,参数写得不对
- 将基于Nullable<T>的类型转换实现在扩展方法中
三.将基于Nullable<T>的类型转换实现在扩展方法中 从上面的介绍我们可以得出这样的结论:如果类型T1和T2能够相互兼容,我们可以借助Convert将T1类型对象转换成T2类型,然后 ...
- C#复习笔记(4)--C#3:革新写代码的方式(扩展方法)
扩展方法 扩展方法有以下几个需求: 你想为一个类型添加一些 成员: 你不需要为类型的实例添加任何更多的数据: 你不能改变类型本身, 因为是别人的代码. 对于C#1和C#2中的静态方法,扩展方法是一种更 ...
随机推荐
- webstrom里面的html页面设置
代码: <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8 ...
- 设置滚动条scrolltop
scrolltop用来设置页面的滚动条的位置 兼容性:链接 $().scrolltop(值)
- Java基础97 json插件的使用(java对象和json字符串对象之间的转换)
1.需要用到的包 2.实例 实体类 people package com.shore.entity; /** * @author DSHORE/2019-4-19 * */ public class ...
- web性能监控与分析
注:原文为:andyguo: <web性能监控与分析> 性能测试需要使用不同的工具,结合系统日志,监控服务器.应用等方面的多项指标.以下阐述监控指标.监控工具.瓶颈分析. 服务端监控指标 ...
- 使用ts-loader与webpack编译typescripts出现Module build failed: TypeError: Cannot read property 'afterCompile' of undefined
解决方法 将ts-loader从4.0降低到3.1.1解决问题.是由于webpack和ts-loader版本不兼容造成的.
- node版本控制之nvm
windows下安装nvm 用nvm-noinstall.zip安装 1.nvm是个啥?nvm是一个可以让你在同一台机器上安装和切换不同版本node的工具linux系统的github地址:点我如果你是 ...
- 关于ie7下display:inline-block;不支持的解决方案。
摘要: 声明:此文章为转载(点击查看原文),如有侵权24小时内删除.联系QQ:1522025433. 今天码的时候遇到这个问题了. 如果本身是内联元素的,把它的display属性设置设置为inline ...
- linux - awk 和kill 批量杀死进程
ps -ef|grep check_os.sh | grep -v grep | awk '{print $2}' | xargs kill -9 $2表示第2列,即进程号PID; grep -v g ...
- python ThreadLocal
ThreadLocal: 主要是为了解决各个线程引用全局变量,并且各个线程之间互不影响而设置的. 实例: import threading threadlocal = threading.local( ...
- 073 HBASE的读写以及client API
一:读写思想 1.系统表 hbase:namespace 存储hbase中所有的namespace的信息 hbase:meta rowkey:hbase中所有表的region的名称 column:re ...