Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.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# 从数据库填充对象图_C#_Sql Server 2005 - Fatal编程技术网

C# 从数据库填充对象图

C# 从数据库填充对象图,c#,sql-server-2005,C#,Sql Server 2005,我想知道填充具有子对象集合且每个子对象可能具有对象集合的对象的最佳方法,该对象可以从数据库中获取,而无需多次调用数据库以获取每个对象的子对象。基本上是分层格式的,例如客户有订单,每个订单都有订单项。最好是以xml格式(SQL server 2005)检索数据,还是通过将相关表连接在一起然后将数据映射到对象来检索数据集?提前感谢您的帮助。您可以看看专门为此类场景设计的和。还有很多变量: 子对象的类型是否相同?如果是,则可以同时选择所有对象,然后在对象映射层中设置父/子关系 子对象可以有自己的子对象

我想知道填充具有子对象集合且每个子对象可能具有对象集合的对象的最佳方法,该对象可以从数据库中获取,而无需多次调用数据库以获取每个对象的子对象。基本上是分层格式的,例如客户有订单,每个订单都有订单项。最好是以xml格式(SQL server 2005)检索数据,还是通过将相关表连接在一起然后将数据映射到对象来检索数据集?提前感谢您的帮助。

您可以看看专门为此类场景设计的和。

还有很多变量:

  • 子对象的类型是否相同?如果是,则可以同时选择所有对象,然后在对象映射层中设置父/子关系
  • 子对象可以有自己的子对象吗?如果嵌套是无限制的,那么除非获得所有数据,否则无法同时获得所有数据
  • 您当然可以对所有客户->订单->订单项目进行联接,并在代码中分解所有内容,但这似乎会在重复的父行中产生大量开销,并在处理这一大混乱时产生大量工作

    试图避免多次调用可能是一种未成熟的优化。对数据库调用过多是否会导致性能问题

    编辑:根据您的评论,您应该能够对每个层次结构级别执行一次查询:

    Select * from orders 
    where orders.customerid = my_customer_id
    
    --执行一些orm映射并列出子对象ID--

    --执行更多ORM映射,并将子对象链接到以前的父对象--

    --重复以上步骤获得更多关卡--


    每个关系级别应该只有一个查询,而不是爆炸式的查询量,以便按id只获取一个对象。

    MS SQL 2005支持通用表表达式,可用于此目的。基本上,它们允许您执行递归查询。在CTE/MS SQL上进行关键字搜索,您会发现很多类似的内容:

    这个问题很老,但新的答案(如果您使用的是实体框架)是在对象查询上使用Include方法。这将急切地加载所有指定的导航属性


    ORMs仍然会对数据库进行多次调用,不是吗?@Tiberiu Ana-只能代表NHibernate,但您可以通过在HQL语法中使用急切抓取或指定连接来避免多次数据库调用。我想看看这方面的证据。除非它使用递归查询,或者它一次读取表中的每个对象,否则它必须多次访问数据库。我不认为NHibernate支持的很多数据库都会支持递归查询(是的,ORM将填充对象图,并且可能在对ORM的一次调用中填充,但ORM将多次命中数据库来完成此操作。)关于同一主题的问题,并给出有希望的答案:不,子对象不是同一类型的。是的,当我需要一次性检索大量数据时,这会导致性能问题,而且我认为这不是一种有效的方法。假设客户有30个订单,并且假设每个订单除了订单项之外还有另一个子对象集合,这将是60个调用来检索客户的所有订单(每个订单有两个数据库调用),完全由子对象填充。这只是这里用来解释这个问题的一个例子。我们的项目中没有使用任何ORM工具,因此目前不允许将所有现有的数据访问代码转换为使用该工具。因此,我认为要么我需要检索一个连接的数据集,然后解析它来构造对象的层次结构,要么从数据库中获取一个xml。无论如何,谢谢你提供的信息。
    Select * from child_order_object 
    where child_order_object_id in (list of child object ids)