2014-04-23 76 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