2014-04-23 80 views
4

我对实体框架比较陌生,我一直在尝试使用包含简单连接的Lambda编写Linq语句。我有三个表格:员工 - StaffRole - 角色。Linq与Lambda相当于SQL

Partial Diagram

我要在满足一定条件下有一定的作用的一名工作人员。它很容易写在常规的SQL:

SELECT * 
FROM Staff s 
INNER JOIN StaffRole sr ON s.StaffId = sr.StaffId 
INNER JOIN Role r ON sr.RoleId = r.RoleId 
WHERE r.Description = 'SpecialisedHealthManager' 
AND s.PrimaryShm = 0 

现在,写在Linq声明并没有给我很多运气。我想这将是这样的:

var actingShm = db.Staff.Join(db.StaffRole, 
          inner => inner.StaffId, 
          outer => outer.Role, 
          (outer, inner) => new 
          { 
           StaffId = inner.StaffId, 
           FirstName = inner.Staff.FirstName, 
           Surname = inner.Staff.Surname, 
           SamAccountName = inner.Staff.SamAccountName, 
           RoleId = outer.Description 
          }); 

不用说,这是行不通的..

+0

[如何在LINQ lambda中的多个表之间执行连接]可能的重复(http://stackoverflow.com/questions/9720225/how-to-perform-join-between-multiple-tables-in-linq-lambda ) –

+0

请看看[如何用lambda表达式连接3个表格] [1] [1]:[http://stackoverflow.com/questions/9120088/how-to-join-3-tables- with-lambda-expression] – Babu

回答

3

尝试使用这种方式:

var list = from s in Staff 
join sr in StaffRole on s.StaffId equals sr.StaffId 
join r in Role on sr.RoleId equals r.RoleId 
where r.Description == 'SpecialisedHealthManager' && s.PrimaryShm == 0 
select new 
{ 
    StaffId = s.StaffId, 
    FirstName = s.Staff.FirstName, 
    Surname = s.Staff.Surname, 
    SamAccountName = s.Staff.SamAccountName, 
    RoleId = r.Description 
}); 
1

你必须有自己的关联设置,以便你能做到这一点...

var actingShm = from s in db.Staff 
       from r in s.Roles 
       where r.Description == "SpecialisedHealthManager" 
       select new 
         { 
          StaffId = s.StaffId, 
          FirstName = s.FirstName, 
          Surname = s.Surname, 
          SamAccountName = s.SamAccountName, 
          RoleId = r.Description 
         }); 

您正在使用实体框架或LINQ2SQL?

+0

我正在使用实体框架 – Carel

+0

使用实体框架搜索谷歌关于多对多关系的教程。我不知道你是否想要数据库优先或代码优先。 – Aron