Tsql XML路径与更多连接

Tsql XML路径与更多连接,tsql,orm,resultset,for-xml-path,Tsql,Orm,Resultset,For Xml Path,我需要一个列出订单和相关数据的网格。(纯粹虚构的例子) 为简单起见: OrderID OrderName OrderDate Collection Parts Collection Destinations Collection SuppliersInvolved 网格应显示每个订单,还应显示每个集合的文本描述, 例如: 现在,这个网格可能有多达200行 这个问题是,我们使用的定制ORM在将多PK结果集映射到唯一对象时存在一些主要的缓慢性问题 例如 即使结果集中涉及1个集合,它也存在此问题。查

我需要一个列出订单和相关数据的网格。(纯粹虚构的例子)

为简单起见:

OrderID
OrderName
OrderDate
Collection Parts
Collection Destinations
Collection SuppliersInvolved
网格应显示每个订单,还应显示每个集合的文本描述, 例如:

现在,这个网格可能有多达200行

这个问题是,我们使用的定制ORM在将多PK结果集映射到唯一对象时存在一些主要的缓慢性问题

例如

即使结果集中涉及1个集合,它也存在此问题。查询本身执行得非常好和快,映射才是问题所在

因此,我只有两个选择(据我所知):

  • 获取订单结果集,对于resultset中的每个订单,获取零件、获取目的地、获取供应商等。这反过来意味着对DB的601次调用

  • 使用XML路径的将每个集合分组在一起。意味着更多的CPU密集型和读取繁重的初始查询

  • 我想知道,首先,上述两种方法中哪一种看起来更好,其次,是否还有其他更好的方法我没有想到。问题是两者都必须使用rubbishy对象映射器(不能为这个查询的结果集创建我自己的DAL映射过程)

    有什么想法吗


    谢谢。

    我认为映射不会成为问题,因为您可以继续使用自定义属性,然后映射它。然而,这里有一个解决这个问题的foxxml路径解决方案

    Declare @t Table(OrderId Int,OrderName Varchar(10),OrderDate DateTime,Part Varchar(2),Destination Varchar(10),Supplier Varchar(10))
    Insert Into @t Values
    (2,'davo','5/21/12','A','London','SuppA'),
    (2,'davo','5/21/12','B','London','SuppB'),
    (2,'davo','5/21/12','C','Paris','SuppC')
    
    Select 
        OrderId
        ,OrderName
        ,OrderDate
        ,Parts = Stuff( (Select Distinct ',' +Cast(Part As Varchar(max))
                         From @t t2 where t1.OrderId = t2.OrderId
                         For Xml Path('')
                         ),1,1,'')
        ,Destinations = Stuff(  (Select Distinct ',' +Cast(Destination As Varchar(max))
                         From @t t2 where t1.OrderId = t2.OrderId
                         For Xml Path('')
                         ),1,1,'')
    
        ,SupplierInvolved = Stuff(  (Select Distinct ',' +Cast(Supplier As Varchar(max))
                         From @t t2 where t1.OrderId = t2.OrderId
                         For Xml Path('')
                         ),1,1,'')
    From @t t1
    Group By t1.OrderId,t1.OrderName,t1.OrderDate
    
    结果是


    在选项1中,编写一个存储过程来获取记录集(使用订单、零件、供应商等表之间的联接),然后您可以使用自定义属性再次映射这些记录集。现在,如果您还想在演示层执行自定义格式设置

    嗨,你是说自定义属性吗?我已经有了使用For XML Path的查询。我注意到,对于实时数据,查询平均时间为3-5秒,跨越大约2000条记录。这对我来说太慢了。如何使用自定义属性进行映射?
    OrderID  OrderName OrderDate  Part  Destination     Supplier
       2        davo    21/5/12   A       London         SuppA
       2        davo    21/5/12   B       London         SuppA
       2        davo    21/5/12   A       London         SuppB
       2        davo    21/5/12   B       London         SuppB
    
    Declare @t Table(OrderId Int,OrderName Varchar(10),OrderDate DateTime,Part Varchar(2),Destination Varchar(10),Supplier Varchar(10))
    Insert Into @t Values
    (2,'davo','5/21/12','A','London','SuppA'),
    (2,'davo','5/21/12','B','London','SuppB'),
    (2,'davo','5/21/12','C','Paris','SuppC')
    
    Select 
        OrderId
        ,OrderName
        ,OrderDate
        ,Parts = Stuff( (Select Distinct ',' +Cast(Part As Varchar(max))
                         From @t t2 where t1.OrderId = t2.OrderId
                         For Xml Path('')
                         ),1,1,'')
        ,Destinations = Stuff(  (Select Distinct ',' +Cast(Destination As Varchar(max))
                         From @t t2 where t1.OrderId = t2.OrderId
                         For Xml Path('')
                         ),1,1,'')
    
        ,SupplierInvolved = Stuff(  (Select Distinct ',' +Cast(Supplier As Varchar(max))
                         From @t t2 where t1.OrderId = t2.OrderId
                         For Xml Path('')
                         ),1,1,'')
    From @t t1
    Group By t1.OrderId,t1.OrderName,t1.OrderDate