【问题标题】:Lambda Expression for joining three tables用于连接三个表的 Lambda 表达式
【发布时间】:2015-01-13 06:04:33
【问题描述】:

员工表

EmpID
Emp_First_Name
Manager_ID
Department_ID
RoleID

部门表

Department_ID
Department_N

角色表

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 表达式中编写相同的查询。 如何使用 Lambda 表达式显示相同的输出?

【问题讨论】:

  • 这个查询语法有什么问题?与查询语法相比,join 的 Lambda 语法更加复杂且难以阅读。
  • 此查询运行良好。但我想在 Lambda 表达式中编写相同的查询。
  • 似乎这些表有明确定义的外键 - 为什么不确保这些是模型中的可导航关系,并使用LoadsWith 指定急切加载深度,从而完全避免连接?跨度>

标签: c# linq linq-to-sql


【解决方案1】:

您可以连续使用Joins,每个都使用新连接继续前面的投影,但正如 cmets 中所述,这很快就会变得混乱且难以遵循:(尤其是如果您习惯使用sql连接语法)

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
});

(我为可追溯性保留了您的原始别名,并使用您的模式为中间匿名投影添加了新别名,例如 edmrEmployeeDepartmentManagerRole

但是,我建议您确保执行似乎存在于表上的外键关系,然后将它们作为可导航关系拉到您的 Linq2Sql DBML 模型中。启用延迟加载或适当的预先加载 LoadsWith DataContext options 设置后,您将能够将查询和投影简化为:

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
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-30
    相关资源
    最近更新 更多