代码之家  ›  专栏  ›  技术社区  ›  Legion

如何在WHERE子句中用LINQ引用联接的表列?

  •  0
  • Legion  · 技术社区  · 6 年前

    我尝试将以下查询转换为LINQ语句:

    SELECT DISTINCT
        rc.RoleCatID, rc.RoleCategoryDescription
    FROM 
        dbo.[Role] r
    INNER JOIN 
        dbo.Employee e ON r.RoleID = e.RoleID
    INNER JOIN 
        dbo.RoleCategory rc ON r.RoleCatID = rc.RoleCatID
    INNER JOIN 
        dbo.Product p ON rc.ProductID = p.ProductID
    WHERE 
        p.ChannelID = '123456'
        AND (p.[ProductID] = 'abc' OR p.[ProductID] = 'def' OR p.[ProductID] = 'ghi')
    

    到目前为止,我有以下内容,但在 where 条款。中间的 selects 也没有帮助。

    db.Roles.Join(db.Employees, r => r.RoleID, e => e.RoleID, (r, e) => r)
        .Join(db.RoleCategories, r => r.RoleCatID, rc => rc.RoleCatID, (r, rc) => r)
        .Join(db.Products, rc => rc.ProductID, p => p.ProductID, (rc, p) => rc)
        .Where(p => p.ChannelID == "123456" && (p.ProductID == "abc" || p.ProductID == "def" || p.ProductID == "ghi")); // <-- this line fails
    

    它看不到任何 Product 表的字段和处理 p 作为 Role 对象从 角色 表。最后一个连接也会受到影响,因为它应该是:

    .Join(db.Products, rc => rc.ProductID, p => p.ProductID, (rc, p) => rc)
    

    然而 rc 被视为 角色 对象而不是 RoleCategory 对象。

    1 回复  |  直到 6 年前
        1
  •  1
  •   John Wu    6 年前

    的结果集 Join 在最后一个lambda表达式中选择了方法。

    在这种情况下,您接受 r e ,它是来自两个表的对象,并且只返回 R :

    .Join(db.Employees, r => r.RoleID, e => e.RoleID, (r, e) => r)
    

    如果你想要 e 您还必须从表达式返回它:

    .Join(db.Employees, r => r.RoleID, e => e.RoleID, (r, e) => new { Role = r, Employee = e})
    

    现在 加入 正在返回具有两个成员的匿名类型:Role和Employee。您可以在随后的任何WHERE或SELECT子句中访问它们中的任何一个。