Linq - 添加多个"dynamic"条件



问题

我有一个IQueryable,我想根据角色进行搜索。一个用户可以有多个角色,所以我希望能够添加多个搜索条件(一个在另一个之上)。

public void OnGet()
{
var productionUnits = _context.ProductionUnits;
IQueryable query = productionUnits;
if (User.IsInRole(CustomRole.AdministratorUAP1))
{
query = productionUnits.Where(c => c.Id == (int)ProductionUnitEnum.UAP1);
}
if (User.IsInRole(CustomRole.AdministratorUAP2))
{
query = productionUnits.Where(c => c.Id == (int)ProductionUnitEnum.UAP2);
}
...
}

预期输出

如果用户身兼多个角色,例如UAP1和UAP2,我希望查询在Where子句中同时获得这两个角色。有什么方法可以实现这一点吗(我知道我可以做List.AddRange(),但我真的想更新查询)。有什么办法做到这一点吗?

我会为用户筛选一个角色列表,并在查询中使用Contains

var roleIds = new List<int>();
if (User.IsInRole(CustomRole.AdministratorUAP1))
{
roleIds.Add(ProductionUnitEnum.UAP1);
}
if (User.IsInRole(CustomRole.AdministratorUAP2))
{
roleIds.Add(ProductionUnitEnum.UAP2)
}
var query = productionUnits.Where(c => roleIds.Contains(c.Id));

这将为这两个角色的查询添加一个IN子句。如果您有两个以上的角色,请根据需要将它们添加到列表中。

每个Linq函数都返回一个IQueryable<>,所以继续重用它:

IQueryable<T> query = productionUnits;          // note the <T>
if (User.IsInRole(CustomRole.AdministratorUAP1))
query = query.Where(c => c.Id == (int)ProductionUnitEnum.UAP1);
if (User.IsInRole(CustomRole.AdministratorUAP2))
query = query.Where(c => c.Id == (int)ProductionUnitEnum.UAP2);

如果用户担任多个角色,例如UAP1和UAP2

然后您的数据库从根本上被破坏了,您将针对单个字段检查这些值:c.Id。一个数字不能同时是两个值。

最新更新