我不确定这个问题的答案是否已经存在,因为我无法弄清楚 Linq 中的机制适用于这种情况,或者我是否只需要手动执行。
假设我有 2 张 table :
------------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();
由于我的表关系已设置,我可以只 foreach 员工表(从 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
)
}
最佳答案
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
}
关于linq-to-sql - Linq to Sql,通过一次查询检索嵌套数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/663579/