Фильтрация результатов в ASP.NET Core Web API - PullRequest
0 голосов
/ 02 июня 2018

Итак, я создаю базу данных, которая позволяет пользователям создавать «волшебный предмет», который они затем могут загрузить в мой веб-API ASP.net.Это работает просто отлично.И я хочу показать все эти элементы на моей веб-странице, потянув их из API.Это тоже отлично работает.Но теперь, когда я пытаюсь отфильтровать, отсортировать или ограничить количество запросов, я все равно получаю базовый список каждого возвращаемого мне предмета.Сейчас всего 14 записей, так что ничего страшного, но я все еще хочу это сделать.Но что бы я ни делал, он всегда возвращает полный список.

Это контроллер ASP.net в visual studio:

[Route("api/v1/MagicItem")]
public class MagicItemController : Controller
{
    private ItemListContext context;

    public MagicItemController(ItemListContext context)
    {
        this.context = context;
    }

    [Produces("application/json")]
    [HttpGet]
    //public List<MagicItem> GetAllItems(string name, string category, string rarity, int? page, string sort, int limit = 5, string dir = "desc")
    public List<MagicItem> GetAllItems(
        string name, 
        string category, 
        string rarity, 
        int? page, 
        string sort,
        int limit = 5,
        string dir = "desc")
    {
        IQueryable<MagicItem> query = context.MagicItems;

        if (!string.IsNullOrWhiteSpace(name))
            query = query.Where(d => d.Name.Contains(name));
        if (!string.IsNullOrWhiteSpace(category))
            query = query.Where(d => d.Category == category);
        if (!string.IsNullOrWhiteSpace(rarity))
            query = query.Where(d => d.Rarity == rarity);


        if (!string.IsNullOrWhiteSpace(sort))
        {
            switch (sort)
            {
                case "Name":
                    if (dir == "asc")
                        query = query.OrderBy(d => d.Name);
                    else if (dir == "desc")
                        query = query.OrderByDescending(d => d.Name);
                    break;
                case "Rarity":
                    if (dir == "asc")
                        query = query.OrderBy(d => d.Rarity);
                    else if (dir == "desc")
                        query = query.OrderByDescending(d => d.Rarity);
                    break;
                case "Category":
                    if (dir == "asc")
                        query = query.OrderBy(d => d.Category);
                    else if (dir == "desc")
                        query = query.OrderByDescending(d => d.Category);
                    break;
            }
        }
        query = query.Take(limit);
        if (page.HasValue)
            query = query.Skip(page.Value * limit);

        return context.MagicItems.ToList();
    }
}

Ответы [ 3 ]

0 голосов
/ 02 июня 2018

В предыдущей версии кода я пока не использовал подкачку страниц, поэтому я создал список элементов в самой строке возврата.Все, что мне нужно было сделать, это вернуть запрос, над которым я работал.

0 голосов
/ 02 июня 2018

Создать метод для фильтра: Сначала мы конвертируем коды фильтра в строку

             string where =string.Empty;

            if (!string.IsNullOrWhiteSpace(name))
                      where + = name;
           if (!string.IsNullOrWhiteSpace(category))
                      where += category;
           if (!string.IsNullOrWhiteSpace(rarity))
                        where += rarity;

               var entity = 
                    setFilter(context.MagicItems,where,order)

                Return entity;

Ваш метод:

          Public IEnumerable setFilter(TEntity entity 
                   ,func<IQueryable<bool 
                   out,TEntity)> where 
                        =null , func<IQueryable<TEntity> 
                  ,IOrderedQueryable<TEntity>> order =null)
                 {
                      IQueryable query = entity;
                      If(whrer != null)
                        {
                           query =query.where(where);
                         }
                          If(order != null)
                        {
                           query =Order(query);
                         }

                        Return query.toList();
                  }
0 голосов
/ 02 июня 2018

Вы почти там:

просто используйте:

return query.ToList();

вместо:

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