ynamic LINQ创建高级查询服务

目录
  • 前言:
  • 一、创建高级查询服务
  • 二、使用DynamicLINQ创建高级查询服务
    • ​1.定义查询参数​
    • ​2.实现查询方法​
    • ​3.实现扩展方法​
    • ​4.效果​

前言:

在业务开发中,一个常用的功能就是“高级查询”,就是客户可以根据自己的需要设置查询条件查找数据,类似下图:

通常,我们需要为每个“高级查询”定制Dto类,用于传输条件,并要根据条件组合成查询语句执行数据库查询操作,费时费力。

现在,使用AutoFilterer.Generators可以轻松实现上述功能。

一、创建高级查询服务

举例:

创建Asp.Net Core Web API项目,引用Nuget包AutoFilterer.Generators。

WeatherForecast类上添加GenerateAutoFilterAttribute:

[GenerateAutoFilter]
public class WeatherForecast
{
    public DateTime Date { get; set; }

    public int TemperatureC { get; set; }

    public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);

    public string Summary { get; set; }
}

然后,修改WeatherForecastController.cs的Get方法,增加WeatherForecastFilter参数:

[HttpGet]:

public IEnumerable<WeatherForecast> Get([FromQuery]WeatherForecastFilter filter)
{
    var rng = new Random();
    // Change range to 100 from 5 to get more reasonable results.
    return Enumerable.Range(1, 100).Select(index => new WeatherForecast
    {
        Date = DateTime.Now.AddDays(index),
        TemperatureC = rng.Next(-20, 55),
        Summary = Summaries[rng.Next(Summaries.Length)]
    })
    .AsQueryable().ApplyFilter(filter)//使用filter
    .ToArray();
}

AutoFilterer.Generators提供了IQueryable.ApplyFilter(filter)扩展方法,可以根据高级查询条件进行数据筛选。

运行程序,可以在Swagger UI看到如下图: 

现在,“高级查询”服务已经完成了。你可以传入最小最大值范围,排序方式,分页方式。

结论:

AutoFilterer.Generators提供了很便利的方式实现“高级查询”,如果大家有类似的业务需求,可以试一下

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

今天,我们介绍如何使用Dynamic LINQ轻松实现更强大的高级查询服务。

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

举例:

创建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 LINQ 使实现起来相当容易,详细参数说明请参看官方文档

到此这篇关于ynamic LINQ创建高级查询服务的文章就介绍到这了,更多相关ynamic LINQ创建高级查询服务内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • LINQ教程之LINQ操作语法

    LINQ查询时有两种语法可供选择:查询表达式语法(Query Expression)和方法语法(Fluent Syntax). 一.查询表达式语法 查询表达式语法是一种更接近SQL语法的查询方式. LINQ查询表达式语法如下: from<range variable> in <IEnumerable<T> or IQueryable<T> Collection> <Standard Query Operators> <lambda expr

  • linq中的分区操作符

    Linq中的分区指的是在不重新排列元素的情况下,将输入序列划分为两部分,然后返回其中一个部分的操作. 一.Take操作符 Take(int n)表示将从序列的开头返回数量为n的连续元素,常用于分页.其定义如下: public static IEnumerable<TSource> Take<TSource>(this IEnumerable<TSource> source, int count); 该方法只接受一个整数,表示要返回的结果的数量. 看下面的例子: usin

  • 在 .NET 平台使用 ReflectionDynamicObject 优化反射调用的代码详解

    基于封装的原则,API 的设计者会将部分成员(属性.字段.方法等)隐藏以保证健壮性.但总有需要直接访问这些私有成员的情况. 为了访问一个类型的私有成员,除了更改 API 设计还有就是使用反射技术: public class MyApi { public MyApi() { _createdAt = DateTime.Now; } private DateTime _createdAt; public int ShowTimes { get; private set; } public void

  • LINQ教程之LINQ简介

    一.为什么要使用LINQ 要理解为什么使用LINQ,先来看下面一个例子.假设有一个整数类型的数组,找到里面的偶数并进行降序排序. 在C#2.0以前,如果要实现这样的功能,我们必须使用'foreach'或'for'循环来遍历数组,先找到偶数然后在降序排序,相关代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;

  • linq中的限定操作符

    限定操作符运算返回一个Boolean值,该值指示序列中是否有一些元素满足条件或者是否所有元素都满足条件. 一.All操作符 All方法用来确定是否序列中的所有元素都满足条件.看下面的例子: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace LimitOperation { class Progra

  • LINQ排序操作符用法

    Linq中的排序操作符包括OrderBy.OrderByDescending.ThenBy.ThenByDescending和Reverse,提供了升序或者降序排序. 一.OrderBy操作符 OrderBy操作符用于对输入序列中的元素进行排序,排序基于一个委托方法的返回值顺序.排序过程完成后,会返回一个类型为IOrderEnumerable<T>的集合对象.其中IOrderEnumerable<T>接口继承自IEnumerable<T>接口.下面来看看OrderBy的

  • LINQ教程之使用Lambda表达式

    C#3.0(.NET3.5)中引入了Lambda表达式和LINQ.Lambda表达式是使用一些特殊语法表示匿名方法的较短方法. 一.最基本的Lambda表达式语法如下: (参数列表)=>{方法体} 说明: 1.参数列表中的参数类型可以是明确类型或者推断类型. 2.如果是推断类型,则参数的数据类型将由编辑器根据上下文自动推断出来. 让我们看看Lambda表达式是如何从匿名方法演变而来的. 相关示例: delegate(int item) { return item % 2 == 0; }; 1.L

  • ynamic LINQ创建高级查询服务

    目录 前言: 一.创建高级查询服务 二.使用DynamicLINQ创建高级查询服务 ​1.定义查询参数​ ​2.实现查询方法​ ​3.实现扩展方法​ ​4.效果​ 前言: 在业务开发中,一个常用的功能就是“高级查询”,就是客户可以根据自己的需要设置查询条件查找数据,类似下图: 通常,我们需要为每个“高级查询”定制Dto类,用于传输条件,并要根据条件组合成查询语句执行数据库查询操作,费时费力. 现在,使用AutoFilterer.Generators可以轻松实现上述功能. 一.创建高级查询服务 举

  • SQL Server 的T-SQL高级查询详解

    目录 基本常用查询 嵌套子查询 from (select … table)示例 示例 in, not in子句查询示例 exists和not exists子句查询示例 some.any.all子句查询示例 聚合查询 1. distinct去掉重复数据 2. compute和compute by汇总查询 3. cube汇总 排序函数 基本语法 row_number函数 rank函数函数 dense_rank函数 partition by分组子句 ntile平均排序函数 集合运算 1. union和

  • SpringBoot 整合 ElasticSearch操作各种高级查询搜索

    目录 一.简介 二.代码实践 三.小结 一.简介 在上篇​SpringBoot 整合 ElasticSearch​​​文章中,我们详细的介绍了 ElasticSearch 的索引和文档的基本增删改查的操作方法! 本文将重点介绍 ES 的各种高级查询写法和使用. 废话不多说,直接上代码! 二.代码实践 本文采用的SpringBoot版本号是2.1.0.RELEASE,服务端 es 的版本号是6.8.2,客户端采用的是官方推荐的Elastic Java High Level Rest Client版

  • MySQL高级查询语法分析

    目录 一.排序 二.分页查询 三.聚合函数 四.分组查询 五.连接查询 1. 内连接查询 2. 左连接查询 3. 右连接查询 4. 自连接查询 六.子查询 一.排序 排序查询语法: select * from 表名 order by 列1 asc/desc [,列2 asc/desc,...] 语法说明: 先按照列1进行排序,如果列1的值相同时,则按照列2排序asc:升序排序(从小到大)desc:降序排序(从大到小)默认是升序排序(asc) 查询未删除男生信息,按学号降序: select * f

  • 教你创建springcloud微服务的基础子服务的超详细过程

    目录 一.创建父项目 1. 选择Spring Initializr 2. Type选择为Maven POM,Java Version选择为8 3. 勾选一些基本的依赖,如lombok和spring-boot-starter-web 4. 创建好了的父项目结构如下: 二.创建二级项目 1. 选择新建Module 2. 选择Maven 3. 填写Name 4. 修改openfeign pom.xml文件,并删除掉该项目下的src文件 5. 创建完成的项目结构如下 三.创建子项目feign-provi

  • Docker使用Dockerfile创建支持ssh服务自启动的容器镜像

    本文实例为大家分享了Dockerfile创建支持ssh服务自启动的容器镜像,供大家参考,具体内容如下 1. 首先创建一个Dockerfile文件,文件内容如下 # 选择一个已有的os镜像作为基础 FROM centos:centos6 # 镜像的作者 MAINTAINER Fanbin Kong "kongxx@hotmail.com" # 安装openssh-server和sudo软件包,并且将sshd的UsePAM参数设置成no RUN yum install -y openssh

  • 详解使用Dockerfile创建带Apache服务的CentOS Docker镜像

    使用Dockerfile创建带Apache服务的CentOS Docker镜像 在宿主机上准备的文件清单: Dockerfile #启动ssh和apache服务的角本 run.sh 以上文件都放到/root/apache_centos目录下 mkdir -p /root/apache_centos cd /root/apache_centos 基础镜像:以镜像centos为基础的开放SSH服务的镜像 [root@localhost apache_centos]# docker images RE

  • 创建Jersey REST 服务,基于Maven的实现

    基于JavaSE形式的REST服务 创建项目 我们首选使用 archetypeGroupId 为 org.glassfish.jersey.archetypes 的原型,archetypeArtifactId为 jersey-quickstart-grizzly2 的原型,创建REST服务项目,使用IDEA创建项目如下: 点击OK后,使用该原始模型创建项目. 运行服务 项目创建好后,原始模型已经默认创建了一个REST服务,我们可以直接启动REST服务,进入项目的根目录,执行如下命令构建和启动服务

  • Java 使用 Graphql 搭建查询服务详解

    背景 随着React的开源,facebook相继开源了很多相关的项目,这些项目在他们内部已经使用了多年,其中引起我注意的就是本次讨论的是graphql,目前官方只有nodejs版,由于很多公司的后台技术栈都是Java,所以便有了graphql的java版实现,在github上可以找到,废话不多说,直接看代码吧,具体介绍还是去看官网吧,不然就跑题了. GraphQLSchema Schema相当于一个数据库,它有很多GraphQLFieldDefinition组成,Field相当于数据库表/视图,

  • 创建支持SSH服务的Docker镜像的方法

    摘要:通常Linux系统管理员通过SSH服务来管理OS,但Docker的很多镜像是不带SSH服务的,可以通过attach(遇到假死的现象)或者exec(目前测试ok)的方法进入容器来管理,但是这些命令都无法解决远程管理容器的问题,因此,当需要远程登陆到容器内进行一些操作的时候,就需要SSH的支持了.本文记录如何使用docker commit创建一个带有SSH服务的ubuntu镜像. (1) 首先以交互的方式运行我们本地的ubuntu容器 docker run -it ubuntu:14.04 /

随机推荐