创建一个空表达式 <Func>
Create an empty Expression <Func>
我正在使用 Repository 模式开发 .NET Core WebApi 项目,但在针对特定情况实施解决方案时遇到了问题:
这是我的控制器方法,我在其中传递一个名为 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 };
}
我在我的服务层的一个方法中也有这段代码,我用它来创建特定的表达式,然后调用我的 Repository 方法来执行特定的查询。
Expression<Func<Activity, bool>> filter = u => u.Name.Equals(name);
var entities = await _activityRepository.GetPaginatedAsync(page, size, filter);
这是我存储库中的行,我在其中执行查询,return根据输入的名称生成所有记录。
await _context.Set<TEntity>().Where(filter).ToListAsync();
当我将某个字符串传递给控制器中的名称变量时,所有代码都可以正常工作。问题是我应该检查用户是否为名称字段输入了任何字符串,如果没有则检查 return 所有记录。
所以我的问题是:有没有办法创建类似空表达式的东西,然后由 LINQ 查询执行?
您可以使用 Func
返回 true
:
Expression<Func<Activity, bool>> filter = u => true;
但我想说可能更好的方法是为过滤器传递 null
值并在 GetPaginatedAsync
中检查它,就像这样:
IQueryable<TEntity> query = _context.Set<TEntity>();
if(filter != null)
{
query = query.Where(filter);
}
await query.ToListAsync();
我正在使用 Repository 模式开发 .NET Core WebApi 项目,但在针对特定情况实施解决方案时遇到了问题:
这是我的控制器方法,我在其中传递一个名为 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 };
}
我在我的服务层的一个方法中也有这段代码,我用它来创建特定的表达式,然后调用我的 Repository 方法来执行特定的查询。
Expression<Func<Activity, bool>> filter = u => u.Name.Equals(name);
var entities = await _activityRepository.GetPaginatedAsync(page, size, filter);
这是我存储库中的行,我在其中执行查询,return根据输入的名称生成所有记录。
await _context.Set<TEntity>().Where(filter).ToListAsync();
当我将某个字符串传递给控制器中的名称变量时,所有代码都可以正常工作。问题是我应该检查用户是否为名称字段输入了任何字符串,如果没有则检查 return 所有记录。 所以我的问题是:有没有办法创建类似空表达式的东西,然后由 LINQ 查询执行?
您可以使用 Func
返回 true
:
Expression<Func<Activity, bool>> filter = u => true;
但我想说可能更好的方法是为过滤器传递 null
值并在 GetPaginatedAsync
中检查它,就像这样:
IQueryable<TEntity> query = _context.Set<TEntity>();
if(filter != null)
{
query = query.Where(filter);
}
await query.ToListAsync();