Linq to Sql - 将 JOIN 结果填充到列表中

Dav*_*vid 5 .net c# linq-to-sql

我不确定这是否可以做到,但情况如下。

我想把这个sql变成linq:

SELECT * FROM Department d
INNER JOIN Employee e ON e.DepartmentID = d.DepartmentID
Run Code Online (Sandbox Code Playgroud)

部门-员工是一对多的关系。

我创建了一个自定义对象,我想将结果填充到其中。

public class DepartmentSummary
{
    public Department Department { get; set; }
    public List<Employee> Employees {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

我想出的 Linq 是

var result = from d in dba.Department
             join e in dba.Employee d.DepartmentID equals e.DepartmentID into j1
             select new DepartmentSummary
             {
                  Department = d,
                  Employees = j1.ToList()
             };
Run Code Online (Sandbox Code Playgroud)

我尝试了一下,但不起作用。有人能给我一些启发吗?我想在部门和员工之间执行内部联接。对于结果集中的每个部门,我想创建一个 DepartmentSummary 对象,该对象保存该部门以及属于该部门的员工列表。

Linq 是否为此提供了临时解决方案,或者我必须迭代结果集并手动创建 DepartmentSummary 列表?

谢谢,

编辑:看起来这对我有用

var result = from d in dba.Department
             join e in dba.Employee d.DepartmentID equals e.DepartmentID into j1
             where j1.Count() > 0
             select new DepartmentSummary
             {
                  Department = d,
                  Employees = j1.ToList()
             };
Run Code Online (Sandbox Code Playgroud)

Jus*_*ren 1

听起来您正在寻找解决延迟加载的方法?

DataLoadOptions dlo = new DataLoadOptions();
dlo.LoadWith<Department>(d => d.Employees);
using (var dba = new MyDataContext())
{
  dba.LoadOptions = dlo;
  var result = from d in dba.Department
      select d;
}
Run Code Online (Sandbox Code Playgroud)

现在,如果您没有在部门和员工之间定义关系(如果您设置了数据库关系,Linq2Sql 设计器将为您执行此操作),那么您应该考虑这样做。它使一切变得更加容易。事实上,您甚至不需要活动摘要。