我有以下查询要转换为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
对象。
答案 0 :(得分:1)
在最后一个lambda表达式中选择了Join
方法的结果集。
在这种情况下,您接受两个表中的对象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})
现在Join
返回的匿名类型有两个成员:Role和Employee。您可以在任何后续的Where或Select子句中访问它们中的任何一个。