【问题标题】:LINQ Logic, Navigating to the ApplicationUser Identity table, roles and a business object called projectLINQ 逻辑,导航到 ApplicationUser Identity 表、角色和名为 project 的业务对象
【发布时间】:2015-05-02 03:42:49
【问题描述】:

我正在尝试获取角色类型为“Project_Manager”且未分配给我传入的 projectId 的 ApplicationUser 列表。我尝试过几种不同的方式,但结果不是我想要的会期待的。对我的逻辑有什么建议吗?

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();

【问题讨论】:

  • 没有什么能立刻让我眼前一亮。结果不符合你的预期?
  • 它返回具有“Project_Manager”角色但“!=” where 子句不起作用的用户列表。我有一个分配给项目的 pm 用户列表,我想要一个未分配的用户列表,以便我可以将它们添加到多选中。现在,我有 2 个 PM 列表。这两个查询之间的唯一区别是“!=”与“==”。是个 '!'在错误的地方?

标签: linq entity-framework-6 asp.net-identity


【解决方案1】:

好的,我的猜测是您的项目之间存在一些用户重叠。我假设您的数据如下所示:

  • 项目1
    • 用户1
    • 用户2
  • 项目2
    • 用户1
    • 用户3

使用此示例数据,如果您将项目 id 1 传递给您的方法,那么您当前的查询将忽略 Project1,而不是项目 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));

【讨论】:

  • 它在“.First”上大吃一惊,所以我尝试了 FirstOrDefault 但它没有产生结果:(
  • 如果没有更多信息,很难说问题出在哪里。你有例外吗?如果是这样,那是什么。
猜你喜欢
  • 1970-01-01
  • 2014-09-09
  • 1970-01-01
  • 2011-08-01
  • 2016-12-06
  • 2012-05-27
  • 2010-10-15
  • 1970-01-01
相关资源
最近更新 更多