【问题标题】:Linq to Sql, retrieving nested data structures with one queryLinq to Sql,一次查询即可检索嵌套数据结构
【发布时间】:2009-03-19 19:04:24
【问题描述】:

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

假设我有 2 张桌子:

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

由于我的表关系已设置,我可以只获取员工表(从 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
                    )
}

【问题讨论】:

    标签: linq-to-sql


    【解决方案1】:
    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
    }
    

    【讨论】:

    • 这看起来不错 - 更好的是,LoadWith 为我提供了一个我不知道存在的功能。赞成。为了最终确定这一点,有没有办法(在第二种方法中)只返回 EmployeeSkills 中的一些列(我只想要/需要 Skill 列,而不是该表中的每一列)
    • 没关系,我只是尝试了显而易见的并将“Skills = employee.EmployeeSkills”更改为“Skills = employee.EmployeeSkills.Select(s=>Skill)”。标记为已回答。
    • 附带说明,需要将 LoadOptions 指定为数据上下文中的第一件事,这有时会很痛苦。正如您所注意到的,它加载了整个信息,这并不总是您需要的。大多数情况下,我会使用 linq 查询,如果需要更新,则只使用 loadoptions。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多