簡體   English   中英

如何使用ADO.NET從DAL層中的多個表返回具有一對多關系的數據

[英]How to return Data from multiple tables in DAL layer with one-to-many relationship using ADO.NET

我有一個客戶表和訂單表,數據庫中有一對多的關系,我的要求是獲得每個客戶的相應訂單列表。 在此輸入圖像描述

以下是customerid = 1的訂單列表

我可以通過數據庫的多次循環調用來做到這一點(例如 - 首先我收集了客戶列表,然后為每個客戶收集了他們在相應listDTO中的訂單列表,最后將帶有oders DTO的客戶列表返回到BAL層。

我認為多次調用數據庫來獲取數據並不好。 有沒有有效的方法。

雖然您可以進行加入,但就像您所說的那樣,您將獲得每個訂單重復客戶信息的多條記錄,您必須對其進行重復刪除。

我喜歡使用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上進行這類調用,這可能是你感興趣的東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM