2010-06-21 63 views
2

VAR查詢=從E在DataContext.Employees 在DataContext.Dept 上e.DeptId加入d等於d.Id 上e.Id加入○在DataContext.OtherInfo 等於o.EmployeeId 其中e.EmployeeId == 4 選擇新Employee_Dept // DTO { EmployeeName = e.Name, DEPTNAME = d.Name EMPLOYEEID = e.ID DEPTID = d.Id ContactNo = o.ContactNo }如何使用Lambda表達式加入LINQ並在DTO中獲得結果?

欲使用Lambda表達式編寫它可以編寫 -

var query = DataContext.Employees.Join(Dept,e=>e.DeptId,d=>d.Id,(e,d)).Where(e=>e.EmployeeId=4) 

任何人都可以幫助我完成此查詢。謝謝你的幫助。

+1

爲什麼呢?連接擴展方法很難看 - 使用你已有的查詢語法。 – 2010-06-21 17:25:18

+1

我的老闆的願望是我的命令不幸....亞,但我也覺得這.. – Vishal 2010-06-21 17:26:55

+0

同意大衛。擴展語法對編碼人來說可能看起來比較「冷」,但它會被下一個開發人員看到的語法改爲查詢語法,因爲這是一個很難理解的問題。 – 2010-06-21 17:27:43

回答

3

It's usually wrong to use join in LINQ to SQL。只要寫:

var query=from e in DataContext.Employees 
      where e.EmployeeId==4 
      select new Employee_Dept//DTO 
      { 
       EmployeeName=e.Name, 
       DeptName=d.Dept.Name 
       EmployeeId=e.ID 
       DeptId=d.Dept.Id 
      } 
+0

我會同意使用連接會降低可讀性,但是您的重寫會在原始問題中做出不明顯的假設:員工與其部門之間存在關聯(即您參考的員工的部門屬性) – Rich 2010-06-21 17:42:12

+0

@Rich ,因爲這是L2S的默認行爲,我不認爲這是一個很大的假設。 – 2010-06-21 18:17:06

5

我同意克雷格斯頓茨,這是加入錯誤使用,但您可以使用以下方式擴展方法表達相同的LINQ查詢:

return DataContext.Employees 
     .Join(DataContext.Dept, e => e.DeptId, d => d.Id, (e,d) => new { Employee = e, Department = d }) 
     .Join(DataContext.OtherInfo, s => s.Employee.Id, o => o.EmployeeId, (s, o) => new { Employee => s.Employee, Department = s.Department, OtherInfo = o }) 
     .Where(e => e.Employee.Id == 4) 
     .Select(e => select new Employee_Dept//DTO 
      { 
       EmployeeName=e.Employee.Name, 
       DeptName=e.Department.Name 
       EmployeeId=e.Employee.ID 
       DeptId=e.Department.Id 
       ContactNo=e.OtherInfo.ContactNo 
      }