如何使用 ASP.net 核心在 Rest Api 中高效过滤结果集

How to efficiency filter result set in a RestApi with ASP.net Core

我目前正在改造我们公司使用多年的旧 API。我有一个特定的端点调用 GetBookings 接受大量参数:

public HttpResponseMessage GetBookings(string contactId, string timeFilter = "upcoming", string bookedBy = null, string resourceTypeIds = null, string clientId = null (...), int pageSize = 25, int pageIndex = 0)
{
   (...)
}

添加所有这些参数并不自然,我一直在寻找一种替代方法来做这类事情。

1/ 我研究了 OData,它似乎提供了一些高级 filtering/paging 选项。

It seems the OData Microsoft version is not up to date (or not maintained?)

2/ 我还可以在名为搜索 (HttpPost) 的预订下添加一个端点并接受 JSON 过滤器。

This approach is NOT really restful and causes some cache issues (as HttpPost requests are not cached).

3/ 我还可以将一个名为 query 的参数添加到我的 get bookings 端点。此查询将包含我的过滤器,如 'StartDate >= ... AND ....'。

This approach seems complicated to implement as I would need to actually parse the query to convert to a lambda expression. I could also use dapper but then it would be vulnerable to SQL Injection.

4/ 我发现的最后一个选项是实际创建一个接受必要参数的端点。

It's easy to implement but kind of ugly?!

您将如何在 ASP.NET 核心 WebApi 中实现 filtering/paging?

谢谢, 塞布

我没有在 .net 核心中尝试过这个,但是对于 webapi,我会创建一个 "criteria" 或 "parameters" 对象,其中包含可以从 URL 设置的属性.

例如

public class BookingSearchParameters
{
    public string contactId { get; set; }

    public string timeFilter { get; set; }

    etc..
}

然后我会让方法将该对象作为参数。

[HttpGet()]
public HttpResponseMessage GetBookings([FromUri] BookingSearchParameters params)
{
    ... do stuff ...
}

对于 URL 调用该方法,您基本上会执行您之前所做的操作,但参数绑定将在您的参数对象中填充适当的值。

如果您想 POST 值到类似的功能,您也可以使用相同的对象。

我们将此方法用于搜索功能,该功能通常接受来自实际 API 调用者的 POST,但我可以通过浏览器非常轻松地向其提供测试值以进行测试。