Общая фильтрация по параметрам строки запроса - PullRequest
0 голосов
/ 28 апреля 2018

Я пытаюсь преобразовать нашу текущую архитектуру API в более общую структуру, способную выполнять запросы, которая не требует от нас жестко фиксировать каждый возможный параметр и создавать собственный запрос. Вот пример того, как выглядит наша текущая архитектура:

[HttpGet]
[Route("Companies/{id:int}/Implementations/Tasks")]
public async Task<IApiResponse<List<CompanyIPTDTO>>> GetCompanyIPTs(int? id = null, 
int? taskId = null, int? completedById = null, DateTime? dateCompletedStart = null, 
DateTime? dateCompletedEnd = null, int page = 1, int? pageSize = null)
{
    // Instantiate generic query
    Expression<Func<CompanyIPT, bool>> query = null;

    // Check parameters and build the lambda query
    // Check if the parameter is given and if the query field is already filled so as to either set or add a query
    if (id != null && query != null) query = query.And(t => t.CompanyID == id);
    else if (id != null && query == null) query = t => t.CompanyID == id;

    if (taskId != null && query != null) query = query.And(t => t.ProcessTaskID == taskId);
    else if (taskId != null && query == null) query = t => t.ProcessTaskID == taskId;

    if (completedById != null && query != null) query = query.And(t => t.CompletedByID == completedById);
    else if (completedById != null && query == null) query = t => t.CompletedByID == completedById;

    if ((dateCompletedStart != null && dateCompletedEnd != null) && query != null) query = query.And(a => a.DateCompleted >= dateCompletedStart && a.DateCompleted <= dateCompletedEnd);
    else if ((dateCompletedStart != null && dateCompletedEnd != null) && query == null) query = a => a.DateCompleted >= dateCompletedStart && a.DateCompleted <= dateCompletedEnd;

    // Execute the GET with the appended query and paging information
    var result = _uow.CompanyIPTRepository.List(filter: query, page: page, pageSize: pageSize);
    int totalPossibleRecords = _uow.CompanyIPTRepository.GetTotalRecords(filter: query);

    return new ApiSuccessResponse<List<CompanyIPTDTO>>(HttpStatusCode.OK, result.Select(x => Mapper.Map<CompanyIPTDTO>(x)).ToList(), result.Count(), Request.RequestUri, totalPossibleRecords, pageSize);
}

И, как вы можете видеть, это становится очень громоздким для большого API при каждом запросе get, чтобы иметь возможность настраивать проверки запросов. Я предполагаю, что должен быть какой-то способ сделать это в общем, основываясь на входящем параметре строки запроса. Например, в этом случае я хотел бы видеть поступающий запрос, который выглядит как

https://www.example.com/api/Companies/15/Implementations/Tasks?q=[completedById=5,dateCompletedStart=1/15/18,dateCompletedEnd=1/17/18]

И после такого входа я предполагаю, что мы могли бы создать что-то, что использует Reflection, чтобы посмотреть на объект и убедиться, что эти поля существуют, и создать общий запрос для попадания в нашу БД?

Кто-нибудь знает, куда направить нас в правильном направлении?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...