使用Dynamic LINQ创建高级查询服务
前言
在以前的文章中,我们介绍了使用AutoFilterer.Generators
创建高级查询服务。
但是,AutoFilterer.Generators
只能提供简单的范围筛选:
今天,我们介绍如何使用Dynamic LINQ轻松实现更强大的高级查询服务。
Demo
创建ASP.NET Core Web API项目,引用Nuget包System.Linq.Dynamic.Core
。
并在WeatherForecastController.cs头部添加:
using System.Linq.Dynamic.Core;
1.定义查询参数
创建DynamicLinqDto
,用于传递返回字段、查询条件、排序方式、分页方式等:
public class DynamicLinqDto
{public string Fields { get; set; }public string Filter { get; set; }public string OrderBy { get; set; }public int? PageNo { get; set; }public int? PageSize { get; set; }
}
2.实现查询方法
修改默认的Get方法如下:
[HttpGet]
[ProducesDefaultResponseType(typeof(WeatherForecast))]
public IEnumerable<dynamic> Get([FromQuery] DynamicLinqDto dto)
{var rng = new Random();IQueryable query = Enumerable.Range(1, 5).Select(index => new WeatherForecast{Date = DateTime.Now.AddDays(index),TemperatureC = rng.Next(-20, 55),Summary = Summaries[rng.Next(Summaries.Length)]}).AsQueryable();return query.ToDynamicArray(dto);
}
由于Get方法的返回类型是IEnumerable,因此需要使用ProducesDefaultResponseTypeAttribute
指定实际返回的类型,以便Swagger页面能显示正确:
3.实现扩展方法
上面最关键的代码是ToDynamicArray
方法。
实际上,这是我们封装的扩展方法,对于任意IQueryable
对象,实现高级查询:
public static class DynamicLinqExtentions
{public static dynamic[] ToDynamicArray(this IQueryable query, DynamicLinqDto dto){if (!string.IsNullOrWhiteSpace(dto.Fields)){query = query.Select($@"new({dto.Fields})");}if (!string.IsNullOrWhiteSpace(dto.Filter)){query = query.Where(dto.Filter);}if (!string.IsNullOrWhiteSpace(dto.OrderBy)){query = query.OrderBy(dto.OrderBy);}var pageNo = dto.PageNo ?? 1;var pageSize = dto.PageSize ?? 10;query = query.Page(pageNo, pageSize);return query.ToDynamicArray();}
}
4.效果
运行程序,传入指定的参数并执行:
可以看到,现在,“高级查询”服务已经完成了:
结论
可以看到Dynamic LINQ使实现起来相当容易。详细参数说明请参看官方文档:https://dynamic-linq.net/
想了解更多内容,请关注我的个人公众号”My IO“
使用Dynamic LINQ创建高级查询服务相关推荐
- 一秒创建高级查询服务
在业务开发中,一个常用的功能就是"高级查询",就是客户可以根据自己的需要设置查询条件查找数据,类似下图: 通常,我们需要为每个"高级查询"定制Dto类,用于传输 ...
- 解答网友提问:如何构建动态表达式实现高级查询服务
上次我们介绍了"一秒创建高级查询服务".前天,有网友在公众号后台问我,怎么使用动态表达式: 我想应该是客户提出了更高的要求,查询的条件不仅限于大于.小于,更加多样化,需要动态组合成 ...
- 动态创建Lambda表达式实现高级查询
需求简介 最近这几天做的东西总算是回归咱的老本行了,给投资管理项目做一个台账的东西,就是类似我们的报表.其 中有一个功能是一个高级查询的需求,在查询条件方面大概有7.8个查询条件.需求就是如果一个条件 ...
- 【javaWeb微服务架构项目——乐优商城day07】——Elasticsearch介绍和安装及使用(安装kibana,安装ik分词器,Spring Data Elasticsearch,高级查询)
文章目录 0.学习目标 1.Elasticsearch介绍和安装 1.1.简介 1.1.1.Elastic 1.1.2.Elasticsearch 1.1.3.版本 1.2.安装和配置 1.2.1.新 ...
- LinQ高级查询、组合查询
LinQ高级查询.组合查询 LinQ高级查询: 1.模糊查询(包含) Repeater1.DataSource = con.car.Where(r =>r.name.Contains(s)).T ...
- LinQ—高级查询方法
对于高级查询方法,主要分为五大类,详情下图: [Distinct]: 避免重复值出现,也就是如果有两个数字2,那么使用集合类可以单一出现 首先我们来写一个数组,方便举例: // 数组数据person ...
- Uber如何使用go语言创建高效的查询服务
在2015年初我们创建了一个微服务,它只做一件事(也确实做得很好)就是地理围栏查询.一年后它成了Uber高频查询(QPS)服务,本次要讲的故事就是我们为什么创建这个服务,以及编程语言新秀Go如何帮我们 ...
- Linq to Xml (1) 创建和查询包含命名空间的XML文档
在项目实施中,我们常常会使用XML作为配置文件,对于普通(不包含命名空间)的XML文档,使用Linq可以很方便地进行读写操作.而对于含有命名空间的XML文档,查询时则需要指定元素所在的命名空间,才能准 ...
- 微服务项目之电商--19.ElasticSearch基本、高级查询和 过滤、结果过滤、 排序和聚合aggregations
接上一篇 目录 3.查询 3.1.基本查询: 3.1.1 查询所有(match_all) 3.1.2 匹配查询(match) 3.1.3 多字段查询(multi_match) 3.1.4 词条匹配(t ...
最新文章
- SQL SERVER 2008查看sql执行的时间
- 【正一专栏】卡卡退役-送别了多少人的青春和初恋
- 测试硬盘读写速度软件_Linux 测试 IO 性能(磁盘读写速度)
- pyaudio usb playback_苹果安卓手机充电器USB接口PSD源文件psd素材
- slz-linux虚拟机的安装-VMware
- php中将SimpleXMLElement Object数组转化为普通数组
- 在Windows宿主机中ssh连接虚拟机CentOS中的Docker容器
- CentOS7.9 EDA软件,Cadence、Synopsys、Mentor、Ansys、Keysight、Matlab、Vivado和Quartus等工具虚拟机平台
- Spring 注解的原理
- andriod studio 自带模拟器设置开发者模式
- android 内存清理命令,安卓手机内存怎么清理 安卓手机内存清理方法【图文】
- Unity-UI控件在不同设备等比例缩放显示
- 国内外证券交易系统开发平台比较
- linux实现进度条
- 锂电池充电的同时也能放电吗?
- 转:com组件纯C++创建
- 解决了联想i908手机SIM卡注册失败、受限服务的BUG
- AE鱼眼镜头畸变扭曲修复插件:RevisionFX RELens for Mac
- 区块链需要学习哪些东西_学习区块链需要什么基础?小白必看
- 深度神经网络DNN的理解