【问题标题】:What is the best way to implement filtering in ASP.NET Core Web API?在 ASP.NET Core Web API 中实现过滤的最佳方法是什么?
【发布时间】:2018-11-30 01:41:29
【问题描述】:

我有一个JobsController,它有一个GetJobs 方法,如下所示:

[HttpGet]
... Task<IActionResult> GetJobs([FromQuery] Pagination urlQuery)
... return await _dbContext.Jobs
              .AsNoTracking
              .Where(x => x.BankId == user.BankId)
              .Skip(urlQuery.Limit *(urlQuery.Offset -1))
              .Take(urlQuery.Limit)
              .ToListAsync()

我已经成功实现了分页功能:.../jobs?limit=25&amp;offset=1

我尝试创建一个过滤器类

...
public int BankId {get; set;}
public bool Archived {get; set;}
...
public bool HaveFilter => !string.IsNullOrEmpty(BankId.ToString()) ||
                          !string.IsNullOrEmpty(Archived.ToString())

但是当尝试将它与分页一起使用时它会变得混乱。

实现服务器端过滤的最佳方法是什么,以便我可以使用 .../jobs?limit=25&amp;offset=1&amp;bankId=3&amp;archived=true 之类的东西?

【问题讨论】:

    标签: entity-framework linq rest asp.net-core asp.net-core-webapi


    【解决方案1】:

    您不必在同一个语句中链接所有过滤器。由于它们都返回 IQueryable,并且在调用 ToListAsync 之前不会实际执行数据库调用,因此您可以轻松地使用 If 语句来链接您需要的内容。

    var dataToReturn = _dbContext.Jobs
              .AsNoTracking;
    
    if(BankId > 0)
         dataToReturn = dataToReturn
              .Where(x => x.BankId == user.BankId);
    
    if(Archived)
         dataToReturn = dataToReturn
              .Where(x => x.Archived);  
    
    return dataToReturn
              .Skip(urlQuery.Limit *(urlQuery.Offset -1))
              .Take(urlQuery.Limit);
              .ToListAsync();
    

    【讨论】:

    • 感谢您的回答!在熟悉了 IQueryable 之后,这是有道理的。
    • 没问题。还有其他方法,比如构建表达式树,但要复杂得多。
    • 如果您想命名并避免重复这些不同的组件,请将其与规范模式结合起来。更多信息:deviq.com/specification-pattern 和 Pluralsight 上的设计模式库。
    猜你喜欢
    • 2010-09-13
    • 2011-11-10
    • 1970-01-01
    • 2018-05-23
    • 2022-01-03
    • 2011-07-08
    • 2018-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多