【问题标题】:Advanced linq expression with multiple joins具有多个连接的高级 linq 表达式
【发布时间】:2013-05-10 08:18:40
【问题描述】:

我有以下 EF 实体:

候选人

  1. 用户(用户)
  2. CandidateId (Guid)
  3. CandidateNumber(整数)

用户

  1. 用户 ID(Guid)
  2. 用户名(Guid)
  3. 角色(集)
  4. 候选人(集)

角色

  1. RoleId (Guid)
  2. 角色名(字符串)
  3. 用户(集)

如您所见,每个候选人都有 UserId - 这是特定候选人创建者的外键。我需要的是检索与创建者和与当前用户具有相同角色的其他用户相关的所有候选人。

例如,我是当前用户 - 它是 FOO,而 FOO 是角色 MY_ROLE。 用户 BOO 也具有相同的角色 MY_ROLE。 所以我需要将检索所有候选人的 linq 查询(c#) 由 FOO 和 BOO 创建并仅由 FOO 的当前用户过滤。

在 TSQL 中——其实做起来很简单。但是在 LINQ 中……对我来说要复杂得多。

这是我的 sql:

SELECT Candidates.*
FROM UsersInRoles 
    INNER JOIN Users ON UsersInRoles.UserId = Users.UserId    
    INNER JOIN Candidates ON Users.UserId = Candidates.UserId 
    INNER JOIN Roles ON UsersInRoles.RoleId = Roles.RoleId 
    WHERE ( Roles.RoleId IN 
                  ( SELECT UsersInRoles.RoleId FROM UsersInRoles 
                     WHERE UsersInRoles.UserId = 'C6B9F0EF-7F23-4BB7-A7DB-DA614B389B13'
                   ) 
               ) 

谢谢。

【问题讨论】:

  • 如果您先发布 SQL 查询会更容易回答。
  • 这是我的 TSQL:SELECT Candidates.* FROM UsersInRoles INNER JOIN Users ON UsersInRoles.UserId = Users.UserId INNER JOIN Candidates ON Users.UserId = Candidates.UserId INNER JOIN Roles ON UsersInRoles.RoleId = Roles .RoleId WHERE ( Roles.RoleId IN ( SELECT UsersInRoles.RoleId FROM UsersInRoles WHERE UsersInRoles.UserId = 'C6B9F0EF-7F23-4BB7-A7DB-DA614B389B13' ) )

标签: c# linq-to-entities


【解决方案1】:

首先我想你想要这样的东西。

var userNames = new [] {"FOO", "BOO"};

var candidates = User.Where(p => userNames.Contains(p.UserName)).Select(p => p.Candidates);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-20
    • 1970-01-01
    • 2012-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多