Web API 多个属性的 HTTPGet?

Web API HTTPGet for multiple attributes?

我们有一个用 DotNet Core 3.1.402 编写的 Web API(我是 DotNet Core 和 WebAPI 的新手)。

我们使用 SqlKata 进行数据库处理。

我们有一个包含 AccountID、AccountName、AccountNumber 等的帐户模型

我们想通过不同的属性获取一个帐户,例如:通过 AccountID、通过 AccountName、通过 AccountNumber。

我们如何才能做到这一点,这样我们就不需要为每个属性使用单独的 HttpGet(这样我们就不必为不同的属性重复相同的代码)?

这是我们在AccountsController中的HttpGet通过AccountID获取账户

public class AccountsController : ControllerBase
{
    private readonly IAccountRepository _accountRepository;

    [HttpGet("{AccountID}")]
    public Account GetAccount(int AccountID)
    {
        var result = _accountRepository.GetAccount(AccountID);
        return result;
    }

这是AccountRepository.cs

中的代码
public Account GetAccount(int accountID)
{
  var result = _db.Query("MyAccountTable").Where("AccountID", accountID).FirstOrDefault<Account>();
  return result;
}

这是帐户class

namespace MyApi.Models
{
   public class Account
   {
       public string AccountID { get; set; }
       public string AccountName { get; set; }
       public string AccountNumber  { get; set; }
       // other attributes
   }
 }

谢谢。

用 GET 做这件事可能会很痛苦,有一些方法可以传递 path/query 数组和复杂的对象但是很难看,你能做的最好的就是使用 POST 而不是 GET并传递一个包含您想要的过滤器的对象。

//In the controller...
[HttpPost]
public Account GetAccount([FromBody]Filter[] DesiredFilters)
{
    var result = _accountRepository.GetAccount(DesiredFilters);
    return result;
}

//Somewhere else, in a shared model...
public class Filter
{
    public string PropertyName { get; set; }
    public string Value { get; set; }
}

//In the repository...
public Account GetAccount(Filter[] Filters)
{
    var query = _db.Query("MyAccountTable");

    foreach(var filter in Filters)
        query = query.Where(filter.PropertyName, filter.Value);

    return query.FirstOrDefault<Account>();
}

现在您可以在请求正文中发送一个 JSON 数组,其中包含您想要的任何过滤器,例如:

[ 
    { "PropertyName": "AccountID", "Value": "3" }, 
    { "PropertyName": "AccountName", "Value": "Whatever" }
]