LINQ逻辑,导航到ApplicationUser标识表、角色和名为project的业务对象

LINQ逻辑,导航到ApplicationUser标识表、角色和名为project的业务对象,linq,entity-framework-6,asp.net-identity,Linq,Entity Framework 6,Asp.net Identity,我正在尝试获取角色类型为“Project\u Manager”且未分配给我传入的projectd的应用程序用户列表。我试着用几种不同的方式写这篇文章,但结果并不是我所期望的。对我的逻辑有什么建议吗 var pmNotAssigned = (from p in db.Project from u in p.Users where p.ProjectId != projectId && u.Roles.Any(r => r.Ro

我正在尝试获取角色类型为“Project\u Manager”且未分配给我传入的projectd的应用程序用户列表。我试着用几种不同的方式写这篇文章,但结果并不是我所期望的。对我的逻辑有什么建议吗

var pmNotAssigned = 
    (from p in db.Project
     from u in p.Users
     where p.ProjectId != projectId && 
         u.Roles.Any(r => r.RoleId == db.Roles.FirstOrDefault(rr => rr.Name == "Project_Manager").Id)
     select u)
    .ToList();

好吧,我猜你的项目之间有一些用户重叠。我假设您的数据如下所示:

  • 项目1
    • 用户1
    • 用户2
  • 项目2
    • 用户1
    • 用户3
使用此示例数据,如果将项目id 1传递给方法,则当前查询将忽略项目1,而不是项目1的所有用户。所以它将返回User1和User3,但您不需要User1

请尝试一下:

var pmNotAssigned = 
    db.Users
    .Where(user =>
        // List of project's users does not contain this user.
        db.Project
            .First(p => p.ProjectId == projectId)
            .Users
            .All(projectUser => projectUser.Id != user.UserId) &&
        // List of this user's roles contains the 'Project_Manager' role.
        user.Roles
            .Any(r => r.RoleId == db.Roles.FirstOrDefault(rr => rr.Name == "Project_Manager").Id));

没有什么东西会立刻向我扑来。它返回一个具有“项目经理”角色但“!=”的用户列表where子句不起作用。我有一个分配给项目的pm用户列表,我希望有一个未分配的用户列表,以便我可以将他们添加到multiselect。现在,我有两张PM的名单。这两个查询之间的唯一区别是“!=”vs'=='。是“!”吗在错误的位置?它在“.First”发出尖叫,因此我尝试了First或default,但没有产生结果:(如果没有更多信息,很难说问题可能是什么。你是否得到异常?如果是,是什么。