【问题标题】:allowing client to filter by multiple parameters允许客户端按多个参数过滤
【发布时间】:2016-08-31 19:18:38
【问题描述】:

我有一个从数据库公开数据的 MVC 解决方案。

他们发出一个 HttpGet,我的控制器将数据提供给客户端:

[HttpGet]
[Route("{someGuid:guid}")]
public HttpResponseMessage Get([FromUri] Guid? someGuid)
{
    var responseData = _someService.RecordSet.Where(x=>x.guid == someGuid);

    return Request.ResponseMessageFromApiEntity(responseData);
}

我将如何实现让客户端能够发出具有多种参数组合的请求的方法? 他们可以传入 2 个或 5 个或最多 10 个,我需要进行过滤这些参数的数据集。

【问题讨论】:

  • 我有多个 get 端点。控制器足够聪明,可以确定正在使用哪一个。像这样:www.YourURL/api/controller?var1=value&var1=value public IHttpActionResult Get(string var1, string var2)
  • 如果他们决定只通过本田怎么办?
  • 试试这篇文章。 tugberkugurlu.com/archive/…。它只是设置一个分隔符来分割参数。我主要使用 web api,所以我只需将一个对象粘贴到 http 请求正文中。
  • 你的意思是传递多个向导?只需将其声明为this answer 中的数组即可。或者你的意思是不同的参数名称?只需将它们作为可空参数添加到方法中并使用Where 链接。
  • @stephen.vakil 我需要多个参数,如果客户端传入一个空参数怎么办,我的 Where 将如何工作?我将如何以有条件的方式链接 where's(基于是否提供参数的条件)

标签: c# asp.net .net asp.net-mvc visual-studio


【解决方案1】:

利用Pipes and Filters Pattern

[HttpGet]
[Route("{someGuid:guid}")]
public HttpResponseMessage Get([FromUri] Guid? someGuid, [FromUri] int someInt)
{
    var responseData = _someService.RecordSet.AsQueryable(); // or some base query or equivalent
    if (someGuid.HasValue)
    {
       responseData = responseData.Where(x=>x.guid == someGuid);
    }

    if (someInt.HasValue)
    {
       responseData = responseData.Where(x=>x.int == someInt);
    }

    return Request.ResponseMessageFromApiEntity(responseData);
}

【讨论】:

    猜你喜欢
    • 2022-01-16
    • 2019-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-23
    • 2018-02-12
    • 2023-03-09
    • 1970-01-01
    相关资源
    最近更新 更多