从数据库填充对象图

时间:2010-05-04 17:03:27

标签: c# sql-server-2005

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

4 个答案:

答案 0 :(得分:1)

您可以查看专为此类情况设计的ORMNHibernate,例如Entity Framework和{{3}}。

答案 1 :(得分:1)

还有很多变数:

  1. 是同一类型的子对象吗?如果是这样,您可以同时选择所有这些,然后在对象映射层中设置父/子关系。
  2. 孩子的对象可以有自己的孩子吗?如果嵌套是无限制的,那么除非获得所有数据,否则无法同时获取所有数据。
  3. 您当然可以加入所有客户 - >订单 - >订单商品并在代码中破解所有内容,但这似乎会在重复的父行和大量工作中产生大量开销处理那个大混乱。

    尽量避免进行多次调用可能是一种预先成熟的优化。您是否因为对数据库进行过多调用而遇到性能问题?

    修改:根据您的评论,您应该能够按层次结构级别执行一次查询:

    Select * from orders 
    where orders.customerid = my_customer_id
    

    - 执行一些orm映射并列出子对象ID -

    Select * from child_order_object 
    where child_order_object_id in (list of child object ids)
    

    - 做一些ORM映射并将子对象链接到以前的父对象 -

    ...

    - 重复更多关卡 -

    您应该能够在每个关系级别只有一个查询,而不是通过id获得一个对象的爆炸式查询量。

答案 2 :(得分:0)

MS SQL 2005支持公用表表达式,可用于此目的。基本上它们允许您进行递归查询。在CTE / MS SQL上进行关键字搜索,你会发现很多这样的东西:Apply a recursive CTE on grouped table rows (SQL server 2005)

答案 3 :(得分:0)

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

https://msdn.microsoft.com/en-us/library/bb738708(v=vs.100).aspx