如何使用Lambda表达式加入LINQ并在DTO中获得结果?

如何使用Lambda表达式加入LINQ并在DTO中获得结果?,linq,join,lambda,Linq,Join,Lambda,var query=来自DataContext.Employees中的e 在DataContext.Dept中加入d 关于e.DeptId等于d.Id 在DataContext.OtherInfo中加入o 关于e.Id等于o.EmployeeId 其中e.EmployeeId==4 选择新员工_Dept//DTO { EmployeeName=e.Name, DeptName=d.Name 雇员ID=e.ID DeptId=d.Id 触点号=o。触点号 } 我想用Lambda表达式来写,这是可以

var query=来自DataContext.Employees中的e 在DataContext.Dept中加入d 关于e.DeptId等于d.Id 在DataContext.OtherInfo中加入o 关于e.Id等于o.EmployeeId 其中e.EmployeeId==4 选择新员工_Dept//DTO { EmployeeName=e.Name, DeptName=d.Name 雇员ID=e.ID DeptId=d.Id 触点号=o。触点号 }

我想用Lambda表达式来写,这是可以写的-

var query = DataContext.Employees.Join(Dept,e=>e.DeptId,d=>d.Id,(e,d)).Where(e=>e.EmployeeId=4)
有人能帮我完成这个查询吗。谢谢你的帮助。

。只要写下:

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
          }

我同意Craig Stuntz的观点,即Join的用法是错误的,但您可以使用以下扩展方法表示相同的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
          }

为什么?连接扩展方法很难看——使用你已经有的查询语法。不幸的是,我老板的愿望是我的命令……是的,但我也觉得……同意David的说法。扩展语法对编写它的人来说可能看起来“更酷”,但下一个看到它的开发人员会将其更改为查询语法,因为理解起来很痛苦。请不要将此视为“挑战你的老板”,但他或她对此有正当的理由吗?这里唯一真正的赢家是查询语法,因为它更容易阅读。我同意使用join会降低可读性,但您的重写会做出一个假设,而这在原始问题中并不明显:员工与其部门(即您引用的员工上的Dept属性)之间存在关联@Rich,因为这是L2的默认行为,我不认为这是一个很大的假设。