代码之家  ›  专栏  ›  技术社区  ›  MyNameIsGuzse

在ASP.NET核心Web API中筛选结果

  •  1
  • MyNameIsGuzse  · 技术社区  · 6 年前

    所以我正在创建一个数据库,允许用户创建一个“魔术项目”,然后他们可以上传到我的asp.net web api。这很管用。我想通过从api中提取这些项来显示我的web页面中的所有这些项。这也很有效。但现在,当我尝试过滤、排序或限制搜索量时,仍然会得到返回给我的每个项目的基本列表。现在,只有14个条目,所以没什么大不了的,但我还是想完成这项工作。但无论我做什么,它总是返回完整的列表。

    这是Visual Studio中的ASP.NET控制器:

    [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 回复  |  直到 6 年前
        1
  •  3
  •   Stefan    6 年前

    你就快到了:

    只需使用:

    return query.ToList();
    

    而不是:

    return context.MagicItems.ToList();
    
        2
  •  0
  •   MyNameIsGuzse    6 年前

    在以前的代码版本中,我还没有使用分页,所以我在返回行本身中创建了项列表。我所要做的就是返回我正在处理的查询。

        3
  •  0
  •   Ali Tooshmalani    6 年前

    为筛选器创建方法: 首先,我们将过滤代码转换为字符串

                 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();
                      }