LeR*_*mme 1 c# linq-expressions entity-framework-core asp.net-core-webapi
我正在使用存储库模式开发 .NET Core WebApi 项目,但在为特定情况实现解决方案时遇到问题:
这是我的 Controller 方法,我在其中传递一个名为 name 的变量,我将使用该变量为 LINQ 查询创建表达式
public async Task<ActionResult<ActivityDto>> GetPaginated(int page, int size, string name)
{
var entities = await _activityService.GetPaginatedActivitiesAsync(page, size, name);
if (!entities.Any())
return NotFound();
return new ObjectResult(entities) { StatusCode = StatusCodes.Status200OK };
}
Run Code Online (Sandbox Code Playgroud)
我的服务层的方法中也有这段代码,我用它来创建特定的表达式,然后调用我的存储库方法来执行特定的查询。
Expression<Func<Activity, bool>> filter = u => u.Name.Equals(name);
var entities = await _activityRepository.GetPaginatedAsync(page, size, filter);
Run Code Online (Sandbox Code Playgroud)
这是我的存储库中的行,我在其中执行查询,该查询根据输入名称返回所有记录。
await _context.Set<TEntity>().Where(filter).ToListAsync();
Run Code Online (Sandbox Code Playgroud)
当我将某个字符串传递给控制器中的 name 变量时,所有代码都可以正常工作。问题是我应该检查用户是否为名称字段输入了任何字符串,如果没有则返回所有记录。所以我的问题是:有没有办法创建类似空表达式的东西,然后由 LINQ 查询执行?
您可以使用Func返回true:
Expression<Func<Activity, bool>> filter = u => true;
Run Code Online (Sandbox Code Playgroud)
但我想说,可能更好的方法是传递null过滤器的值并在内部检查它,GetPaginatedAsync如下所示:
IQueryable<TEntity> query = _context.Set<TEntity>();
if (filter != null)
{
query = query.Where(filter);
}
await query.ToListAsync();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1684 次 |
| 最近记录: |