我有一个员工表,如下表所示。每列都是复合主键的一部分,因此也是子表中的外键:

c# - C#-使用Dapper构建分层数据结构-LMLPHP

c# - C#-使用Dapper构建分层数据结构-LMLPHP

c# - C#-使用Dapper构建分层数据结构-LMLPHP

我创建了以下c#模型来容纳此数据:

public class Company
{
    public string CompanyID {get; set;}
    public List<Departments> Departments {get; set;}
}

public class Departments
{
    public string CompanyID {get; set;}
    public string DepartmentID {get; set;}
    public List<Employee> Employees {get; set;}
}

public class Employees
{
    public string CompanyID {get; set;}
    public string DepartmentID {get; set;}
    public string EmplyeeID {get; Set;}
}


然后,我有一个存储库,我想在其中使用dapper完整填充数据。传统上,在非分层实现中,我只会执行以下操作:

public IEnumerable<Employee> GetEmployees()
{
    IEnumerable<Employee> result = null;
    string sql = "SELECT * FROM EMPLOYEE;"
    using(IDbConnection c = Connection) //declared earlier with connection string
    {
        c.Open();
        result = c.Query<Employee>(sql);
    }

    return result;
}


让我不确定的是,使用dapper构建所需数据结构(在公司类别级别)的最有效方式是,单个公司类别包含部门列表,部门包含员工列表。

我已经修改了多个查询并使用了几个循环来构建结构,但它看起来是如此笨拙,我无法完全正确。

所以这是一个正式的问题:

我们如何使用dapper构建嵌套的可枚举对象来表示分层数据结构?

最佳答案

由于您的员工记录包含所有层次结构信息,因此在进一步的查询中无需返回数据库。只需获取叶子员工记录,然后将它们分组以在内存中形成层次结构即可:

var companies = employees
    .GroupBy(e => new { dept = e.DepartmentID, comp = e.CompanyID })
    .Select(g => new Department
    {
        CompanyID = g.Key.comp,
        DepartmentID = g.Key.dept,
        Employees = g.ToList()
    })
    .GroupBy(d => d.CompanyID)
    .Select(g => new Company
    {
        CompanyID = g.Key,
        Departments = g.ToList()
    });


这将适用于来自源的员工记录,而不仅仅是Dapper。

关于c# - C#-使用Dapper构建分层数据结构,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57680084/

10-11 03:25
查看更多