2012-10-25 46 views
0

我需要一个列出订单和关联数据的网格。 (纯属虚构示例)XML路径vs更多连接

为了简单:

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 

,该网格可以有多达两百行。

这个问题是,我们使用的定制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对DB的调用。

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

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

任何想法?

谢谢。

回答

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 

结果

enter image description here

来到选项1,写一个存储过程,将得到的记录集(使用类似订单,零部件,供应商等各表之间的连接)和那么你可以使用自定义属性再次映射这些。现在,如果您还想在您的表示层执行自定义格式设置。

+0

嗨,你的意思是自定义属性?我已经有了使用For XML Path的查询。我注意到,实时数据显示,查询将在大约两千条记录中平均3-5秒。这对我来说太慢了。我将如何映射自定义属性? – user676767