gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 22:53:01 25 4
gpt4 key购买 nike

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

enter image description here

enter image description here

enter image description here

我创建了以下 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# - 使用 Dapper 构建分层数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57680084/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com