#c# #asp.net-web-api #.net-core #asp.net-core-webapi #http-get
#c# #asp.net-web-api #.net-ядро #asp.net-core-webapi #http-get
Вопрос:
У нас есть веб-API, написанный на DotNet Core 3.1.402 (я новичок в DotNet Core и WebAPI).
Мы используем SqlKata для обработки базы данных.
У нас есть модель учетной записи, которая имеет AccountId, AccountName, AccountNumber и т.д.
Мы хотели бы получить учетную запись по разным атрибутам, например: по идентификатору учетной записи, по имени учетной записи, по номеру учетной записи.
Как мы можем это сделать, чтобы нам не нужен был отдельный HttpGet для каждого атрибута (чтобы нам не приходилось повторять один и тот же код для разных атрибутов)?
Это наш HttpGet в AccountsController для получения учетной записи по идентификатору учетной записи
public class AccountsController : ControllerBase
{
private readonly IAccountRepository _accountRepository;
[HttpGet("{AccountID}")]
public Account GetAccount(int AccountID)
{
var result = _accountRepository.GetAccount(AccountID);
return resu<
}
Это код в AccountRepository.cs
public Account GetAccount(int accountID)
{
var result = _db.Query("MyAccountTable").Where("AccountID", accountID).FirstOrDefault<Account>();
return resu<
}
Это класс Account
namespace MyApi.Models
{
public class Account
{
public string AccountID { get; set; }
public string AccountName { get; set; }
public string AccountNumber { get; set; }
// other attributes
}
}
Спасибо.
Ответ №1:
Выполнение этого с помощью GET может быть болезненным, есть способы передать массивы путей / запросов и сложные объекты, но они уродливы, лучшее, что вы можете сделать, это использовать POST вместо GET и передать объект с нужными фильтрами.
//In the controller...
[HttpPost]
public Account GetAccount([FromBody]Filter[] DesiredFilters)
{
var result = _accountRepository.GetAccount(DesiredFilters);
return resu<
}
//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" }
]
Комментарии:
1. Это работает! Большое спасибо за быстрый ответ!