前言

在以前的文章中,我们介绍了使用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创建高级查询服务相关推荐

  1. 一秒创建高级查询服务

    在业务开发中,一个常用的功能就是"高级查询",就是客户可以根据自己的需要设置查询条件查找数据,类似下图: 通常,我们需要为每个"高级查询"定制Dto类,用于传输 ...

  2. 解答网友提问:如何构建动态表达式实现高级查询服务

    上次我们介绍了"一秒创建高级查询服务".前天,有网友在公众号后台问我,怎么使用动态表达式: 我想应该是客户提出了更高的要求,查询的条件不仅限于大于.小于,更加多样化,需要动态组合成 ...

  3. 动态创建Lambda表达式实现高级查询

    需求简介 最近这几天做的东西总算是回归咱的老本行了,给投资管理项目做一个台账的东西,就是类似我们的报表.其 中有一个功能是一个高级查询的需求,在查询条件方面大概有7.8个查询条件.需求就是如果一个条件 ...

  4. 【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.新 ...

  5. LinQ高级查询、组合查询

    LinQ高级查询.组合查询 LinQ高级查询: 1.模糊查询(包含) Repeater1.DataSource = con.car.Where(r =>r.name.Contains(s)).T ...

  6. LinQ—高级查询方法

    对于高级查询方法,主要分为五大类,详情下图: [Distinct]:  避免重复值出现,也就是如果有两个数字2,那么使用集合类可以单一出现 首先我们来写一个数组,方便举例: // 数组数据person ...

  7. Uber如何使用go语言创建高效的查询服务

    在2015年初我们创建了一个微服务,它只做一件事(也确实做得很好)就是地理围栏查询.一年后它成了Uber高频查询(QPS)服务,本次要讲的故事就是我们为什么创建这个服务,以及编程语言新秀Go如何帮我们 ...

  8. Linq to Xml (1) 创建和查询包含命名空间的XML文档

    在项目实施中,我们常常会使用XML作为配置文件,对于普通(不包含命名空间)的XML文档,使用Linq可以很方便地进行读写操作.而对于含有命名空间的XML文档,查询时则需要指定元素所在的命名空间,才能准 ...

  9. 微服务项目之电商--19.ElasticSearch基本、高级查询和 过滤、结果过滤、 排序和聚合aggregations

    接上一篇 目录 3.查询 3.1.基本查询: 3.1.1 查询所有(match_all) 3.1.2 匹配查询(match) 3.1.3 多字段查询(multi_match) 3.1.4 词条匹配(t ...

最新文章

  1. SQL SERVER 2008查看sql执行的时间
  2. 【正一专栏】卡卡退役-送别了多少人的青春和初恋
  3. 测试硬盘读写速度软件_Linux 测试 IO 性能(磁盘读写速度)
  4. pyaudio usb playback_苹果安卓手机充电器USB接口PSD源文件psd素材
  5. slz-linux虚拟机的安装-VMware
  6. php中将SimpleXMLElement Object数组转化为普通数组
  7. 在Windows宿主机中ssh连接虚拟机CentOS中的Docker容器
  8. CentOS7.9 EDA软件,Cadence、Synopsys、Mentor、Ansys、Keysight、Matlab、Vivado和Quartus等工具虚拟机平台
  9. Spring 注解的原理
  10. andriod studio 自带模拟器设置开发者模式
  11. android 内存清理命令,安卓手机内存怎么清理 安卓手机内存清理方法【图文】
  12. Unity-UI控件在不同设备等比例缩放显示
  13. 国内外证券交易系统开发平台比较
  14. linux实现进度条
  15. 锂电池充电的同时也能放电吗?
  16. 转:com组件纯C++创建
  17. 解决了联想i908手机SIM卡注册失败、受限服务的BUG
  18. AE鱼眼镜头畸变扭曲修复插件:RevisionFX RELens for Mac
  19. 区块链需要学习哪些东西_学习区块链需要什么基础?小白必看
  20. 深度神经网络DNN的理解

热门文章

  1. Dinic算法----最大流常用算法之一
  2. 带你剖析WebGis的世界奥秘----Geojson数据加载(高级)
  3. 文件系统管理相关命令
  4. Android性能优化典范(转)
  5. selenium 使用js执行脚本儿链接整理
  6. windows socket 简单实例
  7. 使用C#制作简易的注册表编辑器
  8. [学习笔记]状压dp
  9. P3174 [HAOI2009]毛毛虫(树形dp)
  10. 【bzoj4145】[AMPPZ2014]The Prices 状压dp