Как построить метод, чтобы получить фильтр по другому параметру? - PullRequest
0 голосов
/ 04 июля 2019

Взгляните на код с этого сайта: https://docs.microsoft.com/en-us/aspnet/core/tutorials/first-web-api?view=aspnetcore-2.2&tabs=visual-studio

В методе GET можно увидеть (код).Функция фильтрации по идентификатору: aip / Todo / 5.Как я могу создать метод (для использования HttpGet), но для фильтрации по другому параметру, как «имя»?

// GET: api/Todo
[HttpGet]
public async Task<ActionResult<IEnumerable<TodoItem>>> GetTodoItems()
{
    return await _context.TodoItems.ToListAsync();
}

// GET: api/Todo/5
[HttpGet("{id}")]
public async Task<ActionResult<TodoItem>> GetTodoItem(long id)
{
    var todoItem = await _context.TodoItems.FindAsync(id);

    if (todoItem == null)
    {
        return NotFound();
    }

    return todoItem;
}

В нашем примере:

namespace TodoApi.Models
{
    public class TodoItem
    {
        public long Id { get; set; }
        public string Name { get; set; }
        public bool IsComplete { get; set; }
    }
}

Так чтоЯ хочу, чтобы у меня было 3 функции: // GET: api / Todo / 5 [HttpGet ("{id}")] *

одна для фильтрации по Id, другая для фильтрации по имени и еще одна дляфильтр над IsComplete.

Как я могу это сделать?

Ответы [ 2 ]

1 голос
/ 07 июля 2019

Я нашел ответ в другом посте: Один контроллер с несколькими методами GET в ASP.NET Web API и здесь: https://nodogmablog.bryanhogan.net/2016/10/web-api-2-controller-with-multiple-get-methods/

Полагаю, я не уточнил, чего хочу. Но большое спасибо за ваши ответы H.Herzl.

0 голосов
/ 04 июля 2019

Во-первых, метод GetTodoItem извлекает элемент задачи по идентификатору. Если вы хотите выполнить поиск элементов задачи по имени, имейте в виду, что поиск вернет один или несколько элементов, в этом случае вы должны использовать тип IEnumerable вместо TodoItem.;этот критерий поиска применяется только в том случае, если имя уникально.

В любом случае, если вы хотите выполнить поиск по имени, вы можете отредактировать свой метод GetTodoItems следующим образом:

// GET: api/Todo

[HttpGet]
public async Task<IEnumerable<TodoItem>> GetTodoItems(string name = "")
{
    // Cast DbSet property to IQueryable<TModel>
    var query = _context.TodoItems.AsQueryable();

    // Validate if name parameter has value
    if (!string.IsNullOrEmpty(name))
        query = query.Where(item => item.Name.Contains(name));

    // Get results from database
    return await query.ToListAsync();
}

Также, если вы хотите выполнить поиск вGetTodoItem по другим параметрам, вы можете внести эти изменения в ваш метод:

// GET: api/Todo/5

[HttpGet("{id}")]
public async Task<IActionResult<TodoItem>> GetTodoItem(long id, string name = "")
{
    var todoItem = await _context.TodoItems.FirstOrDefaultAsync(item => item.id == id);

    if (!string.IsNullOrEmpty(name))
        todoItem = await _context.TodoItems.FirstOrDefaultAsync(item => item.Name.Contains(name));

    return todoItem;
}

Если вы хотите узнать больше о поиске в контроллерах, пожалуйста, проверьте эту статью: Создание веб-API в ASP.NET Core 2.0

Пожалуйста, дайте мне знать, если этот ответ полезен.

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