创建一个空表达式<Func>

问题描述 投票:0回答:1

我正在使用存储库模式开发 .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 };
}

我的服务层的方法中也有这段代码,我用它来创建特定的表达式,然后调用我的存储库方法来执行特定的查询。

Expression<Func<Activity, bool>> filter = u => u.Name.Equals(name);
var entities = await _activityRepository.GetPaginatedAsync(page, size, filter);

这是我的存储库中的行,我在其中执行查询,该查询根据输入名称返回所有记录。

await _context.Set<TEntity>().Where(filter).ToListAsync();

当我将某个字符串传递给控制器中的 name 变量时,所有代码都可以正常工作。问题是我应该检查用户是否为名称字段输入了任何字符串,如果没有则返回所有记录。 所以我的问题是:有没有办法创建类似空表达式的东西,然后由 LINQ 查询执行?

c# entity-framework-core asp.net-core-webapi linq-expressions
1个回答
5
投票

您可以使用

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();
© www.soinside.com 2019 - 2024. All rights reserved.