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

标签 c# .net linq-to-sql

我不确定这是否可以完成,但这是场景。

我想把这个sql转成linq:

SELECT * FROM Department d
INNER JOIN Employee e ON e.DepartmentID = d.DepartmentID

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

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

public class DepartmentSummary
{
    public Department Department { get; set; }
    public List<Employee> Employees {get; set;}
}

我想出的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()
             };

我试过了,还是不行。任何人都可以为我阐明一些光吗?我想在部门和员工之间执行内部连接。对于结果集中的每个部门,我想创建一个 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()
             };

最佳答案

问题是您并不是真的采用一个 SQL 并试图从中创建一个 Linq 查询。

如果是,您会注意到您的 SQL 查询实际上并没有为每个部门生成一行,而是会为该部门的每个员工重复部门信息。

现在,乍一看会建议您使用 group-by 子句,因为这样可以将数据拆分为每个部门的单独分组,但 SQL 中的分组并不能真正为您提供键+全匹配-行类型的结果,而是它允许您进行聚合计算,例如“对于每个部门,我有多少员工”。

所以,为了做你想做的事,你基本上需要做一个正常的加入,这会给你每个员工,加上适当的部门信息(即每个员工将链接到他/她的部门),然后您需要自己构建其余的数据结构。

现在,话虽如此,如果您在与数据上下文相关的类中设置了适当的关系,那么每个部门都应该已经拥有某种包含该部门所有员工的属性,所以也许简单的查询只是“给我所有部门”,然后你可以为每个部门检索员工?

当然,这样做可能会为每个部门执行一个 SQL,但在这种情况下,您返回“将所有员工及其部门信息提供给我”,您必须构建代码来处理其余部分。

关于c# - Linq to Sql - 将 JOIN 结果填充到列表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1580199/

相关文章:

c# - 将应用程序池凭据用于 WebClient 请求

c# - 多个资源文件与单个资源文件

c# - 在解决方案中发现 WCF 服务

c# - 内存记录过多的 LINQ to SQL

linq-to-sql - 用户 'username' 登录失败 - System.Data.SqlClient.SqlException 与外部项目/类库中的 LINQ

c# - 自定义控件 OnPaint 不触发

c# - HttpWebRequest 无法通过代理连接?

c# - 扩展方法之间的模糊方法调用

c# - 更新操作 - 由于对象的当前状态,操作无效

linq-to-sql - 具有超过 16 个参数的 Lambda 表达式 Func