我有一个员工表,如下表所示。每列都是复合主键的一部分,因此也是子表中的外键:
我创建了以下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/