2012-10-25 4 views
0

주문 및 관련 데이터를 나열하는 표가 필요합니다. (순수 가상 예) 편의상XML 경로 대 더 많은 연결

: 그리드 각 순서를 표시한다

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. 는 주문이 결과 집합하기, 등 공급자를 가져, 대상을 가져, 부품을 가져 오는 결과 집합의 각 주문에 대해 이것은 DB에 대한 601 번의 호출을 의미합니다.

  2. FOR XML PATH을 사용하여 각 컬렉션을 그룹화하십시오. 더 많은 CPU를 사용하고 초기 쿼리를 많이 읽음.

것은 내가 생각하지 않은 더 나은 다른 방법이 있는지, 둘째, 더 나은 것, 그리고 다음은 위의 두 가지 방법 중 어느 것이, 첫째, 궁금하네요. 문제는 둘 다 쓰레기 개체 매퍼 (이 쿼리의 결과 집합에 대해서만 내 자신의 DAL 매핑 프로 시저를 만들 수 없음)를 사용해야한다는 것입니다.

아이디어가 있으십니까?

감사합니다.

답변

0

사용자 지정 속성을 사용하여 매핑 할 수 있기 때문에 매핑이 문제가 될 것이라고 생각하지 않습니다. 그러나 여기에 문제의 Fox XML Path 솔루션이 있습니다.

enter image description here

옵션 1로 오는

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 

결과가, (사용하는 주문, 부품, 공급자 등과 같은 테이블 사이에 조인) 레코드 집합을 얻을 것이다 저장 프로 시저를 작성하고 사용자 정의 속성을 사용하여 다시 매핑 할 수 있습니다. 이제 프레젠테이션 레이어에서 사용자 지정 서식을 지정하려는 경우

+0

안녕하세요, 맞춤 속성을 의미합니까? For XML Path를 사용하여 쿼리가 이미 있습니다. 필자는 실제 데이터에 대해 쿼리가 약 2,000 개의 레코드에서 평균 3 ~ 5 초가 걸리는 것으로 나타났습니다. 이것은 나를 위해 너무 느립니다. 맞춤 속성으로 어떻게 매핑합니까? – user676767