在ADO中返回嵌套SQL数据结构的选项.NET

本文关键字:数据结构 选项 NET SQL 嵌套 ADO 返回 | 更新日期: 2023-09-27 17:59:29

我有三个简单的表:

Employees
EmployeePhones
EmployeeEmails

每个员工都有多封电子邮件和多个电话。使用ADO获取所有员工及其所有电话和电子邮件的选项是什么。NET和存储过程。我基本上是在为每个员工填充一个类似的结构(非常简化):

public class Recipient
{
    public Employee RecipientEmployee { get; set; }
    public List<EmployeeEmail> RecipientEmails { get; set; }
    public List<EmployeePhone> RecipientPhones { get; set; }
}

一种选择是进行初始数据库调用以获取所有员工。然后对每个员工进行迭代,并拨打额外的电话,获取每个员工的电话和电子邮件。显然,在这样做的过程中,我将有一个初始的数据库调用,再加上每个返回的员工至少一个额外的调用。可能会有很多员工。

另一种选择是打三个DB电话,获取所有员工、所有电话和所有电子邮件,并以某种方式将三个数据集交叉。

还有其他选择吗?

项目是使用C#ADO编写的。NET调用SQL Server 2008中的存储过程。解决方案也应该这样做。

在ADO中返回嵌套SQL数据结构的选项.NET

为什么不能在所有表之间执行JOIN(如下所示),然后从过程中返回一个记录集,然后将其存储在DataSetDataTable中的应用程序中(假设所有这3个表之间都定义了关系)

select e.name, e.age, e.city,
ep.primaryphone, ee.primaryemail
from Employees e join EmployeePhones ep on e.id = ep.eid
join EmployeeEmails ee on e.id = ee.eid;

根据您的最新评论,使用group by:进行示例查询

select e.name, e.age, e.city,
ep.primaryphone, ee.primaryemail
from Employees e join 
( select eid, primaryphone
    from EmployeePhones 
   group by eid ) ep on e.id = ep.eid
join (
  select eid, primaryemail
   from EmployeeEmails 
   group by eid ) ee on e.id = ee.eid;