如何使用ADO.NET

时间:2016-01-22 05:49:02

标签: c# asp.net-mvc ado.net

我有一个客户表和订单表,在数据库中有一对多的关系,我的要求是获得每个客户的相应订单列表。enter image description here

以下是customerid = 1

的订单列表

我能够通过数据库的多次循环调用来实现(例如 - 首先我收集了客户列表,然后为每个客户我在相应的listDTO中收集了他们的订单列表,最后将oders DTO的客户列表返回给BAL层。

我认为多次调用数据库来获取数据并不好。有没有有效的方法。

2 个答案:

答案 0 :(得分:0)

虽然您可以进行加入,但就像您说的那样,您将为每个订单复制客户信息取回多条记录,您必须对其进行重复删除。

我喜欢使用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: - )

答案 1 :(得分:0)

如果您使用的是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处进行这类通话,这可能是您感兴趣的内容。