按条件过滤列表作为元素内的嵌套元素

时间:2018-08-08 13:28:53

标签: c# linq entity-framework-core

我想返回过滤其特定角色的用户列表。一个用户可以具有多个角色,但是用户列表始终排除具有“ PRIMARY”角色之一的用户。我在where()方法中包括了两个条件,但是列表仅过滤第一个条件。

  IList<Account> users = _context.Account.AsNoTracking()
    .Include(a => a.Profile)
    .Include(a => a.AccountRole)
    .ThenInclude(r => r.Role)
    .Where(a => (a.Organization == "My Company") && 
          (a.AccountRole.Any(r => r.Role.Name != "PRIMARY")))
    .ToList();

4 个答案:

答案 0 :(得分:3)

a.AccountRole.Any(r => r.Role.Name != "PRIMARY")

这样写,表示

  

具有至少一个不是“ PRIMARY”角色的所有用户

您想要的是:

!a.AccountRole.Any(r => r.Role.Name == "PRIMARY")
  

所有没有任何角色的用户都是“ PRIMARY”

答案 1 :(得分:1)

  

排除具有“ PRIMARY”角色的用户

因此,遵循逻辑:必须如此。

IList<Account> users = _context.Account.AsNoTracking()
    .Include(a => a.Profile)
    .Include(a => a.AccountRole)
    .ThenInclude(r => r.Role)
    .Where(a => !a.AccountRole.Any(r => r.Role.Name == "PRIMARY") // can't contain a role PRIMARY 
        && a.Organization == "My Company")
    .ToList();

答案 2 :(得分:1)

我认为问题出在第二个条件where子句。您可以尝试将其更改为:

IList<Account> users = _context.Account.AsNoTracking()
    .Include(a => a.Profile)
    .Include(a => a.AccountRole)
    .ThenInclude(r => r.Role)
    .Where(a => (a.Organization == "My Company") && 
          (! a.AccountRole.Any(r => r.Role.Name == "PRIMARY")))
    .ToList();

这可能起作用,因为第二个条件仅在AccountRole中没有“ PRIMARY”角色时才起作用。

答案 3 :(得分:0)

您应将a.AccountRole.Any(r => r.Role.Name != "PRIMARY")修改为!a.AccountRole.Any(r => r.Role.Name != "PRIMARY")