创建一个空表达式 <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();