首頁 > 軟體

ynamic LINQ建立高階查詢服務

2022-03-14 19:01:21

前言:

在業務開發中,一個常用的功能就是“高階查詢”,就是客戶可以根據自己的需要設定查詢條件查詢資料,類似下圖: 

通常,我們需要為每個“高階查詢”客製化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建立高階查詢服務內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com