ynamic LINQ创建高级查询服务

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

前言:

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

ynamic LINQ创建高级查询服务

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

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

一、创建高级查询服务

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

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

ynamic LINQ创建高级查询服务

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

结论:

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

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

ynamic LINQ创建高级查询服务

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

ynamic LINQ创建高级查询服务

​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))    {    www.easck.com  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.效果​

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

ynamic LINQ创建高级查询服务

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

ynamic LINQ创建高级查询服务

结论:

可以看到Dynamic LINQ LINQ 使实现起来相当容易,详细参数说明请参看官方文档