使用Dynamic LINQ创建高级查询服务

前言

在以前的文章中,我们介绍了使用AutoFilterer.Generators创建高级查询服务。

但是,AutoFilterer.Generators只能提供简单的范围筛选:

93897e5b3e5d1e1fc7520175e4d99782.png

今天,我们介绍如何使用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页面能显示正确:

94739ec36a3f4bd0a678a4ceee5c06ba.png

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.效果

运行程序,传入指定的参数并执行:

b81b7e641da6cae54cae86061bccd4e4.png

可以看到,现在,“高级查询”服务已经完成了:

de8f9523aecfede950e095bc05dc4681.png

结论

可以看到Dynamic LINQ使实现起来相当容易。详细参数说明请参看官方文档:https://dynamic-linq.net/

想了解更多内容,请关注我的个人公众号”My IO“

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/291122.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

线程池的开源实现(mariadb和percona版本)

2019独角兽企业重金招聘Python工程师标准>>> 一、"Thread pool in MariaDB 5.5" 线程池解决的问题&#xff1a; 传统mysql使用一个线程处理一个客户端连接&#xff0c;如果许多的并发用户&#xff0c;将使性能下降。因为大量的线程将引起上下文交换&#…

C++之goto

1 goto code: result:

ABP vNext微服务架构详细教程——结束语

ABP vNext微服务架构详细教程——简介ABP vNext微服务架构详细教程——架构介绍ABP vNext微服务架构详细教程——身份管理服务ABP vNext微服务架构详细教程——基础服务层ABP vNext微服务架构详细教程——聚合服务ABP vNext微服务架构详细教程——身份认证服务ABP vNext微服务架…

创建 linux分区命令,Linux中创建分区

在很多情况下我们可能需要在使用Linux的时候创建新的分区来帮助我们更好的学习和工作&#xff0c;接下来我就详细的介绍一下如何利用fdisk这条命令进行硬盘分区。Linux磁盘分区和windows存在区别&#xff0c;Linux分区分为三类 主分区 扩展分区 和逻辑分区。然而它们三个关系有…

Android studio之Error:(23, 17) Failed to resolve: junit:junit:4.12

1 probleam 2 resolve method // testCompile junit:junit:4.12

20杨氏矩阵查找

问题描述&#xff1a;在一个m行n列二维数组中&#xff0c;每一行都按照从左到右递增的顺序排序&#xff0c;每一列都按照从上到下递增的顺序排序。请完成一个函数&#xff0c;输入这样的一个二维数组和一个整数&#xff0c;判断数组中是否含有该整数。 例如下面的二维数组就…

玩一玩微信公众号开发(一) 接入系统

一开始我准备学一学微信开发。后来看了一下文档&#xff0c;需要自己搭服务器进行接口对调。有点麻烦所以就没继续学下去。现在学习过了Kotlin、Spring Boot很多东西&#xff0c;感觉可以比较方便的进行开发了。今天就来回过头学习一下。 准备工作 申请公众号 首先说明一下&…

Android studio之NDK integration is deprecated in the current plugin解决办法

1 、问题 编译Android项目&#xff0c;出现下面错误 NDK integration is deprecated in the current plugin 2、解决办法 在我们 gradle.properties(Project Properties) file add android.useDeprecatedNdktrue

使用 System.Net.Http.Json 简化 HttpClient 的使用

使用 System.Net.Http.Json 简化 HttpClient 的使用Intro从 .NET Core 3.1 开始&#xff0c;微软添加了一个 System.Net.Http.Json 的扩展&#xff0c;可以用来简化 HttpClient 的使用&#xff0c;看到在很多项目里还并未开始使用&#xff0c;所以想向大家介绍一下SamplePostAs…

MySQL的四种不同查询的分析

1.前置条件&#xff1a;本次是基于小数据量&#xff0c;且数据块在一个页中的最理想情况进行分析&#xff0c;可能无具体的实际意义&#xff0c;但是可以借鉴到各种复杂条件下&#xff0c;因为原理是相同的,知小见大&#xff0c;见微知著&#xff01;打开语句分析并确认是否已经…

.NET6之MiniAPI(十八):OpenAPI swagger

从本篇开始&#xff0c;介绍一些很不错的三方库&#xff0c;来丰富MiniAPI的使用。在创建MiniAPI项目时&#xff0c;模板提供了一个是否启用OpenAPI的选项&#xff0c;足见这个三方库的优势和强大。OpenAPI为我们测试API提供了强大的支持&#xff0c;调用API的开发人员&#xf…

Android之ndk-build出现c:28:51: error: ‘get_string‘ undeclared here (not in a function)解决办法

1 problem ndk-build error: get_string undeclared here (not in a function) 2 resolve jstring get_strstring(JNIEnv* env, jobject thiz) {return (*env)->NewStringUTF(env, "I am chenyu, 动态注册JNI"); }jint add_int(JNIEnv* env, jobject jobj, ji…

BeetleX服务网关授权配置

很多应用服务都需要授权访问&#xff0c;为了更好地统一处理这种授权验证&#xff0c;服务网关提供了JWT验证插件用于解决这问题。网关的JWT验证插件默认是关闭的&#xff0c;只有当开启后网关才会对请求进行拦截验证处理。开启开启JWT验证需要在插件管理里开启Webapi JWT验证插…

Linux下的压缩与解压缩

tar命令zip命令unzip命令gzip命令bzip2命令tar命令&#xff1a;压缩和解压缩tar格式的文件格式&#xff1a;tar [主选项辅选项] 文件或目录【主选项告诉tar要做什么事&#xff0c;是必须要有的&#xff0c;辅选项是辅助使用的&#xff0c;和通常的选项一样&#xff0c;可选】主…

Android之JNI动态注册native方法和JNI数据简单使用

1、爆结果照片 2、介绍JNI注册方式 JVM 查找 native 方法有两种方式: 1)、按照 JNI 规范的命名规则(静态注册) 2) 、调用 JNI 提供的 RegisterNatives 函数,将本地函数注册到 JVM 中(动态注册) 静态注册的实现可以参考我的这篇博客 http://blog.csdn.net/u01…

Linux怎么查询全部容器时间,linuxea:如何单单修改docker容器的系统时间

一般情况下&#xff0c;我们仅仅需要修改容器的时间与我们宿主机的实际实际一致即可&#xff0c;我们知道&#xff0c;默认情况下docker容器是不允许访问系统时钟&#xff0c;但是有一款开源的软件使这样的需求变成了可能。此lib拦截用于检索当前时间和日期的所有系统调用&…

关闭系统索引(转)

转自“http://jingyan.baidu.com/article/d621e8daeaaa392865913f0a.html” 关闭系统索引 Windows索引服务是为文件、电子邮件和其他内容提供内容索引、属性缓存和搜索结果。 Windows系统在安装完成后&#xff0c;会逐步创建特定文件、文件夹和其它目标的索引&#xff0c;例如开…

如何编译 dotnet/aspnetcore 源代码

前言最近&#xff0c;准备为 dotnet/aspnetcore 修改 issue&#xff0c;但是在 clone 代码后&#xff0c;发现要编译成功&#xff0c;远没有想象中那么容易。因此&#xff0c;将整个过程进行记录&#xff0c;以供大家参考。以下操作都是在 Windows 10 下完成。0.环境准备详见官…

linux 编译工具链,Linux工具链for TKStudio下载_Linux工具链for TKStudio官方下载-太平洋下载中心...

Linux工具链for TKStudio是一款支持TKStudio IDE集成开发环境的辅助LINUX交叉编译工具链软件&#xff0c;交叉编译就是跨架构编译&#xff0c;编译出来的程序不能在本机执行(当然有例外情况)。所以这个时候就需要交叉编译工具链。译工具链一般最简化的为 binutils gcc glibc …

Convolutional Neural Networks for Visual Recognition 1

Introduction 这是斯坦福计算机视觉大牛李菲菲最新开设的一门关于deep learning在计算机视觉领域的相关应用的课程。这个课程重点介绍了deep learning里的一种比较流行的模型&#xff1a;Convolutional Neural Networks&#xff0c;简称CNN&#xff0c;主要利用CNN来做visual r…