Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.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从DAL层中具有一对多关系的多个表返回数据_C#_Asp.net Mvc_Ado.net - Fatal编程技术网

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

C# 如何使用ADO.NET从DAL层中具有一对多关系的多个表返回数据,c#,asp.net-mvc,ado.net,C#,Asp.net Mvc,Ado.net,我在数据库中有一个客户表和一对多关系的订单表,我的要求是为每个客户获得相应的订单列表 以下是为customerid=1完成的订单列表 我可以通过多次循环调用数据库(例如,首先我收集了客户列表,然后针对每个客户,我在相应的listDTO中收集了他们的订单列表,最后使用orders DTO将客户列表返回给BAL层) 我认为多次调用数据库来获取数据是不好的。有没有有效的方法来实现这一点。虽然您可以进行连接,但正如您所说,您将为每个订单返回多条记录,复制客户信息,您必须对其进行编码以消除重复 我喜欢使用

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

以下是为customerid=1完成的订单列表

我可以通过多次循环调用数据库(例如,首先我收集了客户列表,然后针对每个客户,我在相应的listDTO中收集了他们的订单列表,最后使用orders DTO将客户列表返回给BAL层)


我认为多次调用数据库来获取数据是不好的。有没有有效的方法来实现这一点。

虽然您可以进行连接,但正如您所说,您将为每个订单返回多条记录,复制客户信息,您必须对其进行编码以消除重复

我喜欢使用SqlDataReader对多个结果集的支持来简化这一过程

因此,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进行了包装,以促进这些类型的调用,这可能是您感兴趣的事情。

使用,Luke。您可以在这里发布一些代码。。。否则,在SQL中,您可以执行以下操作。。。您可以添加一些
Select C.*,O.*来自客户C Left Join Orders O on C.CustomerID=O.CustomerID
谢谢,Join可能会有所帮助,但在一对多关系的情况下,我将为每个客户获得多条记录,然后我需要运行循环以创建所需的DTO。我说得对吗?谢谢,@Cleverguy25。这很有帮助。