Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 在ASP.NET核心Web API中实现过滤的最佳方法是什么?_Entity Framework_Linq_Rest_Asp.net Core_Asp.net Core Webapi - Fatal编程技术网

Entity framework 在ASP.NET核心Web API中实现过滤的最佳方法是什么?

Entity framework 在ASP.NET核心Web API中实现过滤的最佳方法是什么?,entity-framework,linq,rest,asp.net-core,asp.net-core-webapi,Entity Framework,Linq,Rest,Asp.net Core,Asp.net Core Webapi,我有一个JobsController,它有一个GetJobs方法,如下所示: [HttpGet] ... Task<IActionResult> GetJobs([FromQuery] Pagination urlQuery) ... return await _dbContext.Jobs .AsNoTracking .Where(x => x.BankId == user.BankId) .

我有一个
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&offset=1&bankId=3&archived=true的内容

您不必在同一语句中链接所有筛选器。由于它们都返回IQueryable,并且在调用ToListSync之前不会实际执行数据库调用,因此可以轻松地使用
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之后,这是有道理的。没问题。还有其他方法,比如构建表达式树,但这要复杂得多。如果您想命名并避免重复这些不同的组件,请将其与规范模式结合起来。更多信息,请访问Pluralsight上的设计模式库。
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();