ASP.NET Core 使用 Sieve 套件建立 API 分頁功能

先使用 NuGet 安裝 Sieve 套件,或是使用 .NET CLI 執行以下指令安裝:
	
dotnet add package Sieve
    

在 Program.cs 中註冊服務:
    
using Sieve.Services;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddScoped<ISieveProcessor, SieveProcessor>();

var app = builder.Build();
    

假設我們有 User 這個類別:
    
public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
}
    

我們可以建立 UserFilter ,用來儲存 User API 的過濾條件,需要繼承 SieveModel
    
    public class UserFilter : SieveModel
    {
    }
    

在 API 的查詢參數中放入 UserFilter ,就可以達成分頁的功能:
    
[ApiController]
[Route("[controller]")]
public class UserController : ControllerBase
{
    private readonly ISieveProcessor _sieveProcessor;

    public UserController(ISieveProcessor sieveProcessor)
    {
        _sieveProcessor = sieveProcessor;
    }

    [HttpGet]
    public IActionResult Get([FromQuery] UserFilter filter)
    {
        var users = new List<User>
        {
            new User { Id = 1, Name = "小明", },
            new User { Id = 2, Name = "大頭", },
            new User { Id = 3, Name = "老王", },
        }.AsQueryable();

        var result = _sieveProcessor.Apply(filter, users)
            .ToList();
        
        return Ok(result);
    }
}
    

在 SwaggerUI 介面上就可以看到多了查詢參數,可以使用 Page 代表第幾頁, PageSize 代表每頁數量。就可以達成自動分頁功能:

過濾

要過濾/篩選的話只要在 User 上面增加 Sieve Attribute,將 CanFilter 設定為 true,就可以過濾了:
    
public class User
{
    [Sieve(CanFilter = true)]
    public int Id { get; set; }
    public string Name { get; set; }
}
    

過濾範例:
Id=3 (屬性有區分大小寫)
    
/User?Filters=Id==3
    

這裡的等於需要使用「==」,其他條件可以直接查看官方範例

排序

排序也是只要在 User 上面增加 Sieve Attribute,將 CanSort 設定為 true,就可以排序了:
    
public class User
{
    [Sieve(CanSort = true)]
    public int Id { get; set; }
    public string Name { get; set; }
}
    

Id 遞增排序:
    
/User?Sorts=Id
    

Id 遞減排序:
    
/User?Sorts=-Id
    

假設要過濾又要排序可以這樣寫:
    
public class User
{
    [Sieve(CanFilter = true, CanSort = true)]
    public int Id { get; set; }
    public string Name { get; set; }
}
    



參考資料:
github - Biarity/Sieve

留言