3

私は次のようなlinqクエリを持っています:(より大きなクエリの一部ですが、これは問題を示しています)

from guarantee in tblGuarantees
from nextExptDev in
            (from gd in tblGuaranteeDevaluations
             where gd.fkGuaranteeId == guarantee.pkGuaranteeId &&
                   gd.Date == null
             orderby gd.ExpectedDate ascending
             select new
             {
                gd.Sum,
                gd.CurrencyId,
                gd.ExpectedDate
             }).Take(1).DefaultIfEmpty()
select new
{
    guarantee.pkGuaranteeId,
    nextExptDev.Sum,
    nextExptDev.CurrencyId,
    nextExptDev.ExpectedDate
}

次の SQL が生成されます。

SELECT [t0].[pkGuaranteeId],
       [t3].[Sum]          AS [Sum],
       [t3].[CurrencyId]   AS [CurrencyId],
       [t3].[ExpectedDate] AS [ExpectedDate2]
FROM   [dbo].[tblGuarantee] AS [t0]
       CROSS APPLY ((SELECT NULL AS [EMPTY]) AS [t1]
                    OUTER APPLY (SELECT TOP (1) [t2].[Sum],
                                                [t2].[CurrencyId],
                                                [t2].[ExpectedDate]
                                 FROM   [dbo].[tblGuaranteeDevaluation] AS [t2]
                                 WHERE  ( [t2].[fkGuaranteeId] = [t0].[pkGuaranteeId] )
                                        AND ( [t2].[Date] IS NULL )
                                 ORDER  BY [t2].[ExpectedDate]) AS [t3])
ORDER  BY [t3].[ExpectedDate] -- Why here?

私の質問は、なぜそれが最後ORDER BYにあるのですか?私のより大きなクエリでは、パフォーマンスが大幅に低下し、なぜそれが必要なのかわかりません。

また、これをより良い方法で書くためのヒントをいただければ幸いです。

4

3 に答える 3

2

クエリでは、

from gd in tblGuaranteeDevaluations
         where gd.fkGuaranteeId == guarantee.pkGuaranteeId &&
               gd.Date == null
         orderby gd.ExpectedDate ascending

これにより、内部クエリは内部ブロックで順序付けを行いました

SELECT TOP (1) [t2].[Sum], [t2].[CurrencyId], [t2].[ExpectedDate]
    FROM [dbo].[tblGuaranteeDevaluation] AS [t2]
    WHERE ([t2].[fkGuaranteeId] = [t0].[pkGuaranteeId]) AND ([t2].[Date] IS NULL)
    ORDER BY [t2].[ExpectedDate]

しかし、ヌル セットと内部ブロック セットの 2 つの異なるセットを「結合」しています。そのため、順序を確保するために、コードは「結合」の結果セットに対して別の順序を設定する必要があります。 order は外側のセットにあり、自動コード生成ですが、セットは既に順序付けされているため、最後のorder by によってパフォーマンスが低下することはありません。

于 2013-02-06T12:43:22.720 に答える
-1

あなたのクエリでは、これをやっています:

orderby gd.ExpectedDate ascendingこれは、生成された SQL に反映されます。

于 2013-02-07T21:05:17.107 に答える