0

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

为简单起见:

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 映射过程)。

有任何想法吗?

谢谢。

4

1 回答 1

0

我认为映射不会成为问题,因为您可以继续使用自定义属性,然后对其进行映射。但是,这里有一个 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,编写一个将获取记录集的存储过程(使用订单、零件、供应商等表之间的连接),然后您可以使用自定义属性再次映射它们。现在,如果您还想在表示层进行自定义格式设置。

于 2012-10-26T03:57:55.147 回答