如何使用linq引用where子句中的联接表列?

时间:2018-10-02 18:34:10

标签: c# entity-framework linq

我有以下查询要转换为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视为Role对象。最后的联接也会受到损害,因为它应该是:

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

然而,rc被视为Role对象而不是RoleCategory对象。

1 个答案:

答案 0 :(得分:1)

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

在这种情况下,您接受两个表中的对象re,并仅返回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})

现在Join返回的匿名类型有两个成员:Role和Employee。您可以在任何后续的Where或Select子句中访问它们中的任何一个。