ynamic LINQ创建高级查询服务

 更新时间:2022年3月14日 21:39  点击:340 作者:My IO

前言:

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

通常,我们需要为每个“高级查询”定制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创建高级查询服务内容请搜索猪先飞以前的文章或继续浏览下面的相关文章希望大家以后多多支持猪先飞!

原文出处:https://blog.51cto.com/MyIO/5044346

[!--infotagslink--]

相关文章

  • JavaScript动态创建div属性和样式示例代码

    1.创建div元素: Javascript代码 复制代码 代码如下: <scripttypescripttype="text/javascript"> functioncreateElement(){ varcreateDiv=document.createElement("div"); createDiv.innerHTML="Testcreateadiveleme...2013-10-13
  • JS创建Tag标签的方法详解

    这篇文章主要介绍了JS创建Tag标签的方法,结合具体实例形式分析了javascript动态操作页面HTML元素实现tag标签功能的步骤与相关操作技巧,需要的朋友可以参考下...2017-06-15
  • 什么是cookie?js手动创建和存储cookie

    什么是cookie? cookie 是存储于访问者的计算机中的变量。每当同一台计算机通过浏览器请求某个页面时,就会发送这个 cookie。你可以使用 JavaScript 来创建和取回 cookie 的值。 有关cookie的例子: 名字 cookie 当访...2014-05-31
  • PS如何创建变形文字 ps给文字变形的方法

    PS怎么创建变形文字?ps中想要给输入的文字变形,该怎么调整文字的显示形态呢?下面我们就来看看ps给文字变形的方法,需要的朋友可以参考下 我们在图层上输入文字后,可以...2017-07-06
  • C#使用linq对数组进行筛选排序的方法

    这篇文章主要介绍了C#使用linq对数组进行筛选排序的方法,实例分析了C#实用linq扩展进行数组排序的技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • idea 无法创建Scala class 选项的原因分析及解决办法汇总

    这篇文章主要介绍了idea 无法创建Scala class 选项的解决办法汇总,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-09-02
  • php创建无限级树型菜单

    写递归函数,可考虑缓存,定义一些静态变量来存上一次运行的结果,多程序运行效率很有帮助.。 大概步骤如下: step1:到数据库取数据,放到一个数组, step2:把数据转化为一个树型状的数组, step3:把这个树型状的数组转为html代码。...2015-11-08
  • C#中的Linq Intersect与Except方法使用实例

    这篇文章主要介绍了C#中的Linq Intersect与Except方法使用实例,本文直接给出示例代码,需要的朋友可以参考下...2020-06-25
  • Drupal模块开发之创建自己的钩子

    Drupal可以让第三方模块创建自己的钩子。在通常的实践中,有两种类型的钩子你可能想要创建,一种是内容修改类的钩子,一种是拦截类的钩子。 Drupal的钩子系统允许和模...2016-11-25
  • javascript创建对象的几种模式介绍

    下面小编就为大家带来一篇javascript创建对象的几种模式介绍。小编觉得挺不错的,现在分享给大家,也给大家做个参考...2016-05-09
  • C#创建Windows服务的实现方法

    这篇文章主要介绍了C#创建Windows服务的实现方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • C#对Word文档的创建、插入表格、设置样式等操作实例

    今天小编就为大家分享一篇C#对Word文档的创建、插入表格、设置样式等操作实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-06-25
  • C#动态创建button的方法

    这篇文章主要介绍了C#动态创建button的方法,涉及C#按钮属性动态设置的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • 详解js创建对象的几种方式和对象方法

    这篇文章主要介绍了详解js创建对象的几种方式和对象方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-01
  • C#中 dynamic、Object和var之间的实际区别是什么?何时使用它们?

    dynamic关键字和动态语言运行时(DLR)是.Net 4.0中新增的功能。 什么是动态编程语言有时可以划分为静态类型化语言和动态类型化语言。C#和Java经常被认为是静...2020-05-11
  • 在java中使用SPI创建可扩展的应用程序操作

    这篇文章主要介绍了在java中使用SPI创建可扩展的应用程序操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-09-14
  • c# Linq常用的小技巧

    这篇文章主要介绍了c# Linq常用的小技巧,文中讲解非常详细,示例代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下...2020-11-03
  • 浅析在javascript中创建对象的各种模式

    下面小编就为大家带来一篇浅析在javascript中创建对象的各种模式。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2016-05-09
  • C#创建、部署、调用WebService图文实例详解

    本文主要用详细的图文给大家介绍C#创建、部署、调用WebService的全部过程以及中间需要避免的问题。...2020-06-25
  • JS动态创建元素的两种方法

    这篇文章主要为大家详细介绍了JS动态创建元素的两种方法,字符串拼接形式,或是使用Document、Element对象自带的一些函数 ,需要的朋友可以参考下...2016-04-22