Linq to Sql,使用一个查询检索嵌套数据结构

时间:2009-03-19 19:04:24

标签: linq-to-sql

我不确定这个问题的答案是否已经存在,因为我无法弄清楚Linq中针对这种情况的机制是什么,或者我是否需要手动完成。

假设我有两张桌子:

------------Employees-------------
EmployeeID  Name  -other columns-

   ---------EmployeeSkills-----------
   EmployeeID  Skill  -other columns-

因此每位员工可以拥有0或更多技能。

我的目标是将此信息绘制到内存中的数据结构中,使用一个SQL查询

    class StaticEmployee
    {
        int EmployeeID;       
        string Name;
        List<string> Skills;
    }
    List<StaticEmployee> employees = (???).ToList();

由于我的表关系已经设置,我可以直接访问employees表(来自db.Employees中的员工选择员工),但是当我访问EmployeeSkills属性时,它将执行单独的查询每个员工记录,因为第一个查询未返回该数据。

或者,就Sql而言,我想做的就是运行带左连接的查询:

SELECT Employees.EmployeeID, Employees.Name, EmployeeSkills.Skill FROM Employees LEFT JOIN EmployeeSkills ON Employees.EmployeeID=EmployeeSkills.EmployeeID

这会让我得到我的清单,但我需要手动将其整理到我的清单中,因为具有2种技能的员工将返回2行。 是否有Linq操作可以执行此操作? 下面的假设示例

from employee in db.Employees
select new 
{
   EmployeeID = employee.EmployeeID, 
   Name = employee.Name,
   Skills = new List(
                     from employeeSkill in employee.EmployeeSkills 
                     select employeeSkill.skill
                    )
}

1 个答案:

答案 0 :(得分:4)

var options = new DataLoadOptions();
options.LoadWith< Employees>(e => e.EmployeeSkills);
context.LoadOptions = options;
//retrieve employees, they will come loaded with EmployeeSkills

如果你要使用linq查询版本,这也会加载一次:

from employee in db.Employees
select new 
{
   EmployeeID = employee.EmployeeID, 
   Name = employee.Name,
   Skills = employee.EmployeeSkills
}