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 つのコレクションが含まれている場合でも、この問題が発生します。クエリ自体は問題なく高速に実行されます。問題はマッピングです。

したがって、実際には2つのオプションが残っています(私が見る限り):

  1. 注文の結果セットを取得し、結果セット内の注文ごとに、パーツをフェッチし、目的地をフェッチし、サプライヤーをフェッチします。これは、DB への 601 回の呼び出しを意味します。

  2. FOR XML PATHを使用して、各コレクションをグループ化します。より多くの CPU を集中的に使用し、大量の初期クエリを読み取ることを意味します。

第一に、上記の 2 つのアプローチのどちらがより優れているように見えるか、そして第二に、私が思いもよらなかった他のより良いアプローチがあるかどうかを考えています。問題は、両方とも厄介なオブジェクト マッパーを使用する必要があることです (このクエリの結果セットのためだけに独自の 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 では、レコード セットを取得するストア プロシージャを記述し (Orders、Parts、Suppliers などのテーブル間の結合を使用)、カスタム プロパティを使用してそれらを再度マップできます。必要に応じて、プレゼンテーション層でカスタム書式設定も行います。

于 2012-10-26T03:57:55.147 に答える