Лямбда-выражение для объединения трех таблиц

1

Таблица сотрудников

EmpID
Emp_First_Name
Manager_ID
Department_ID
RoleID

Таблица отделов

Department_ID
Department_N

AME

Таблица ролей

RoleID
RoleName

Объединение трех таблиц

var join = from u in db.TBL_Employees
                       join v in db.TBL_Departments
                       on u.Department_ID equals v.Department_ID
                       join x in db.TBL_Employees
                       on u.Manager_ID equals x.Emp_ID
                       join z in db.TBL_Roles
                       on u.RoleID equals z.RoleID
                       select new
                       {
                           Name = u.Emp_First_Name,
                           Department = v.Department_Name,
                           Manager = x.Emp_First_Name,
                           Role = z.RoleName
                       };

Этот запрос работает нормально. Но я хочу написать тот же запрос в Lambda Expression. Как отобразить один и тот же результат с помощью выражения Lambda?

  • 2
    В чем проблема с этим синтаксисом запроса? Лямбда-синтаксис для join намного сложнее и труднее для чтения по сравнению с синтаксисом запроса.
  • 0
    Этот запрос работает нормально. Но я хочу написать тот же запрос в лямбда-выражении.
Показать ещё 1 комментарий
Теги:
linq
linq-to-sql

1 ответ

1

Вы можете сделать это как последовательность Joins, каждый из которых продолжает предыдущую проекцию с новым соединением, но, как упоминалось в комментариях, это скоро становится беспорядочным и трудным для подражания: (особенно, если вы привыкли использовать синтаксис Sql join)

var result = db.TBL_Employees
   .Join(db.TBL_Departments, u => u.Department_ID, v => v.Department_ID, 
         (u, v) => new {Employee = u, Department = v})
   .Join(db.TBL_Employees, ed => ed.Employee.Manager_ID, x => x.Emp_ID, 
         (ed, x) => new {EmployeeDepartment = ed, Manager = x})
   .Join(db.TBL_Roles, edm => edm.EmployeeDepartment.Employee.RoleID, z => z.RoleID, 
         (edm, z) => new {EmployeeDepartmentManager = edm, Role = z})
.Select(edmr => new
{
  Name = edmr.EmployeeDepartmentManager.EmployeeDepartment.Employee.Emp_First_Name,
  Department = edmr.EmployeeDepartmentManager.EmployeeDepartment.Department.Department_Name,
  Manager = edmr.EmployeeDepartmentManager.Manager.Emp_First_Name,
  Role = edmr.Role.RoleName
});

(Я сохранил ваши первоначальные псевдонимы для отслеживания и добавил новые псевдонимы для промежуточных анонимных прогнозов, используя ваш шаблон, например edmr - EmployeeDepartmentManagerRole)

Тем не менее, я бы рекомендовал вам убедиться, что отношения внешнего ключа, которые, как представляется, присутствуют в таблицах, применяются, а затем вытаскивают их через навигационные отношения в вашей модели DBL Linq2Sql. Если включена либо ленивая загрузка, либо с соответствующей загрузкой LoadsWith DataContext, вы можете просто уменьшить запрос и проецирование:

var result = db.TBL_Employees
   .Select(e => new
{      
    Name = e.Emp_First_Name,
    Department = e.Department.Department_Name,
    Manager = e.Manager.Emp_First_Name,
    Role = e.Role.RoleName
});

Ещё вопросы

Сообщество Overcoder
Наверх
Меню