C# 按条件筛选列表作为元素中的嵌套元素

C# 按条件筛选列表作为元素中的嵌套元素,c#,linq,entity-framework-core,C#,Linq,Entity Framework Core,我想返回一个筛选其特定角色的用户列表。一个用户可以有多个角色,但用户列表始终排除其中一个角色为“主要”的用户。我在where() IList<Account> users = _context.Account.AsNoTracking() .Include(a => a.Profile) .Include(a => a.AccountRole) .ThenInclude(r => r.Role) .Where(a => (a

我想返回一个筛选其特定角色的用户列表。一个用户可以有多个角色,但用户列表始终排除其中一个角色为“主要”的用户。我在
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();
IList用户=_context.Account.AsNoTracking()
.包括(a=>a.Profile)
.Include(a=>a.AccountRole)
.然后包括(r=>r.Role)
其中(a=>(a.组织==“我的公司”)&
(a.AccountRole.Any(r=>r.Role.Name!=“PRIMARY”))
.ToList();
这样写的意思是

至少有一个角色不是“主要”的所有用户

你想要的是:

!a.AccountRole.Any(r => r.Role.Name == "PRIMARY")
没有任何角色的所有用户都是“主”

这样写的意思是

至少有一个角色不是“主要”的所有用户

你想要的是:

!a.AccountRole.Any(r => r.Role.Name == "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();
IList用户=_context.Account.AsNoTracking()
.包括(a=>a.Profile)
.Include(a=>a.AccountRole)
.然后包括(r=>r.Role)
.Where(a=>!a.AccountRole.Any(r=>r.Role.Name==“PRIMARY”)//不能包含主角色
&&a.组织机构==“我的公司”)
.ToList();
排除其中一个角色为“主要”的用户

因此,遵循逻辑:它必须是

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();
IList用户=_context.Account.AsNoTracking()
.包括(a=>a.Profile)
.Include(a=>a.AccountRole)
.然后包括(r=>r.Role)
.Where(a=>!a.AccountRole.Any(r=>r.Role.Name==“PRIMARY”)//不能包含主角色
&&a.组织机构==“我的公司”)
.ToList();

我认为问题在于第二个条件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();
IList用户=_context.Account.AsNoTracking()
.包括(a=>a.Profile)
.Include(a=>a.AccountRole)
.然后包括(r=>r.Role)
其中(a=>(a.组织==“我的公司”)&
(!a.AccountRole.Any(r=>r.Role.Name==“PRIMARY”))
.ToList();

这可能会起作用,因为第二个条件只有在AccountRole中没有“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();
IList用户=_context.Account.AsNoTracking()
.包括(a=>a.Profile)
.Include(a=>a.AccountRole)
.然后包括(r=>r.Role)
其中(a=>(a.组织==“我的公司”)&
(!a.AccountRole.Any(r=>r.Role.Name==“PRIMARY”))
.ToList();

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

您应该将
a.AccountRole.Any(r=>r.role.Name!=“主要”)
编辑为
!a、 AccountRole.Any(r=>r.Role.Name!=“PRIMARY”)

您应该将
a.AccountRole.Any(r=>r.Role.Name!=“PRIMARY”)
编辑为
!a、 AccountRole.Any(r=>r.Role.Name!=“主”)

!a、 AccountRole.Any(r=>r.Role.Name==“PRIMARY”)
a.AccountRole.Any(r=>r.Role.Name!=“PRIMARY”)
非常不同。非常感谢你<代码>!a、 AccountRole.Any(r=>r.Role.Name==“PRIMARY”)
a.AccountRole.Any(r=>r.Role.Name!=“PRIMARY”)
非常不同。非常感谢你!!!很好的解释。1+很好的解释。1+@Hoánguyễn为voting@Ho阿恩古伊ễn Cam on for Voting在您发布第四版相同答案之前,此问题已回答三次。而且,你把它弄错了,因为你保留了
=在您发布同一答案的第四个版本之前,此问题已经回答了三次。而且,你把它弄错了,因为你保留了
=