【问题标题】:XML Path vs more connectionsXML 路径与更多连接
【发布时间】:2012-10-25 17:26:45
【问题描述】:

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

为简单起见:

OrderID
OrderName
OrderDate
Collection Parts
Collection Destinations
Collection SuppliersInvolved

网格应该显示每个订单,以及每个集合的文字描述, 例如:

OrderID  OrderName OrderDate  Parts  Destinations     SupplierInvolved
   2        davo    21/5/12   A,B,C  London, Paris    SuppA,SuppB,SuppC 

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

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

例如。

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

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

所以,我真的有两个选择(据我所知):

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

  2. 使用 FOR XML PATH 将每个集合组合在一起。意味着更多的 CPU 密集型和读取繁重的初始查询。

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

有什么想法吗?

谢谢。

【问题讨论】:

    标签: tsql orm resultset for-xml-path


    【解决方案1】:

    我认为映射不会成为问题,因为您可以继续使用自定义属性,然后对其进行映射。不过,这里有一个 Fox XML Path 解决方案。

    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 秒。这对我来说太慢了。如何使用自定义属性进行映射?
    猜你喜欢
    • 1970-01-01
    • 2022-06-29
    • 2012-12-14
    • 1970-01-01
    • 1970-01-01
    • 2017-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多