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