如何使用 ADO.NET 从 DAL 层中具有一对多关系的多个表中返回数据

本文关键字:关系 数据 返回 一对多 NET ADO 何使用 DAL | 更新日期: 2023-09-27 18:31:34

数据库中有一个客户表和具有一对多关系的订单表,我的要求是获取每个客户的相应订单列表。在此处输入图像描述

这是针对客户 ID = 1 完成的订单列表

我能够通过数据库的多个周期调用来做到这一点(例如 - 首先我收集了客户列表,然后对于每个客户,我在相应的 listDTO 中收集了他们的订单列表,最后将带有 oders DTO 的客户列表返回到 BAL 层。

我认为多次调用数据库以获取数据是不好的。有没有有效的方法可以做到这一点。

如何使用 ADO.NET 从 DAL 层中具有一对多关系的多个表中返回数据

虽然您可以执行联接,但就像您所说的那样,您将获得每个订单的多条记录,重复客户信息,您的代码必须删除重复数据。

我喜欢使用 SqlDataReader 对多个结果集的支持来简化此操作。 https://msdn.microsoft.com/en-us/library/hh223698(v=vs.110).aspx

所以你的SQL将看起来像这样:

--Assume that @CustomerId is a parameter (always use parameters!)
SELECT CustomerId, CustomerName
  FROM Customer
 WHERE CustomerId = @CustomerId
SELECT OrderId, OrderDate --all your order columns
  FROM Orders
 WHERE CustomerId = @CustomerId

然后在您的 ADO.Net 代码中:

using (var reader = command.ExecuteDataReader())
{
    while (reader.Read())
    {
        //read first result set
    }
    reader.NextResult();
    while (reader.Read())
    {
        //read secondresult set
    }
}

或者更好的是,使用异步版本的ExecuteDataReader,Read,NextResult :-)

如果您使用的是 SQL 2016,则可以使用 JSON 路径查询很好地完成此操作返回 JSON 的分层结构,然后可以将其反序列化到对象中,或者可能传递到客户端。

SELECT
            O.ORDER_ID orderId,
            O.ORDER_NAME orderName,
            O.ACTIVE_START orderDate,
            (SELECT
                OI.ORDER_ITEM_ID itemId,
                OI.NAME name,
                OI.COMMENTS comments
            FROM
                dbo.ORDER_ITEM OI
            WHERE
                O.ORDER_ID = OI.ORDER_ID
            FOR JSON PATH) items
        FROM
            dbo.[ORDER] O
        WHERE
            O.PERSON_ID = @PERSON_ID
        FOR JSON PATH;

这将返回类似的东西

[
  {
    "orderId": 21,
    "orderName": "my first order",
    "orderDate": "2016-09-18T11:01:41",
    "items": [
      {
        "itemId": 41,
        "name": "pizza",
        "comments": "Extra Cheese Please"
      },
      {
        "itemId": 42,
        "name": "italian sandwich",
        "comments": "No peppers"
      }
    ]
  }
]...

有一个 git 项目,它有围绕 ado 的包装器,用于促进这些类型的调用 https://github.com/ahhsoftware/EzAdoVSSolution 这可能是你感兴趣的东西。