Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在ADO.NET中返回嵌套SQL数据结构的选项?_C#_Sql Server 2008_Tsql_Ado.net - Fatal编程技术网

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

C# 在ADO.NET中返回嵌套SQL数据结构的选项?,c#,sql-server-2008,tsql,ado.net,C#,Sql Server 2008,Tsql,Ado.net,我有三张简单的桌子: Employees EmployeePhones EmployeeEmails 每个员工都有多封电子邮件和电话。使用ADO.NET和存储过程获取所有员工及其所有电话和电子邮件的选项有哪些。我基本上是在尝试为每个员工填充类似的结构,非常简单: public class Recipient { public Employee RecipientEmployee { get; set; } public List<EmployeeEmail>

我有三张简单的桌子:

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中调用存储过程编写的。解决方案也应该这样做。

为什么不能在所有表之间进行如下的联接,然后从过程中返回一个记录集,然后可以将该记录集存储在应用程序的DataSet或DataTable中,假设所有这三个表之间都定义了关系

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的示例查询:


所有表都有关系。每个员工都可能有未知数量的电话和未知数量的电子邮件。这是最好的处理方法吗?返回重复的员工并在员工id?AFAIK上汇总结果,这是最好的方法;在DB端执行DB计算,然后在应用程序端执行DB计算。此外,如果您有重复项,那么可以使用一些分析/窗口函数在SELECT查询中处理重复项。是的,我的测试数据在合并表时为单个员工返回多达8个结果。每个员工有多部电话和多封电子邮件。我很好奇,从重复行聚合一个大数据集以获取唯一的电子邮件和唯一的电话是否会比多个db呼叫更快。必须进行测试。嗯,不确定,但可能是您的查询有问题,但在没有看到查询+表结构+样本数据的情况下无法确定;但无论如何,您都不应该执行多个DB调用,因为这需要大量资源。您可能想发布一个带有查询+表结构+示例数据的单独问题;如果你觉得有什么不对劲。你发布的查询对我来说正如期发挥作用。但是,EmployeePhones和EmployeeEmail包含每个员工的多个记录。我相信这里应该有重复的表。如果您愿意在C端做一些额外的工作,只需在存储过程中执行三次选择即可返回三个表的内容。必须使用C代码才能从一个结果集前进到下一个结果集。它减少了所需的往返次数、通过加入数据返回的重复数据,并可以将应用程序与数据中的更改隔离开来,但让应用程序将关系重新组合在一起。或者进行连接并返回XML?好主意。我也在想同样的事情,但是使用一个包含多个表的数据集,你提醒我NextResult可以使用阅读器。谢谢
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;