2011-06-18 2 views
3

私はちょっと複雑なlinq2sqlクエリを持っていますが、order byステートメントは含まれていませんが、linq2sqlはそれが必要だと思って挿入します。残念ながら文がパフォーマンスを痛いと私はそれを削除する方法がわからないこの「順」...linq2sqlは不要ですORDER BY

はここでlinq2sql式(Iはとにかく、彼らは役立つかもしれないと思いますが、ない...)

です
var lockedBy = Guid.NewGuid(); 
var locks = LinqDataContext.Instance.LockBranches(3, lockedBy, DateTime.Now + TimeSpan.FromMinutes(3)); // Stored procedure... 

var x = LinqDataContext.Instance.Branches 
.Where(branch => branch.LockedBy == lockedBy) 
.Select 
(
    branch => new 
    { 
     Branch = branch, 
     Leaves = branch.Leaves 
     .Select 
     (
      leaf => new 
      { 
       Leaf = leaf, 
       Estimate = leaf.Representation.Estimates 
       .GroupBy(estimate=>estimate.SegmentID) 
       .Sum 
       (
        estimatesBySegment => estimatesBySegment.Average 
        (
         estimate => estimate.EstimateRequests.Average 
         (
          estimateRequest => estimateRequest.EstimateSubmit.Value 
         ) 
        ) 
       ) 
      } 
     ) 
    } 
); 

それは、order byが子コレクションLeavesを区別することができるように必要とされる次のSQL

SELECT [t0].[ID], [t0].[IndexID], [t0].[IndexNo], [t0].[Sealed], [t0].[LockedBy], [t0].[UnlockOn], [t1].[ID] AS [ID2], [t1].[BranchID], [t1].[RepresentationID], [t1].[Xml], (
    SELECT SUM([t7].[value]) 
    FROM (
     SELECT AVG([t6].[value]) AS [value] 
     FROM (
      SELECT (
       SELECT AVG([t5].[Value]) 
       FROM [dbo].[EstimateRequests] AS [t4] 
       LEFT OUTER JOIN [dbo].[EstimateSubmits] AS [t5] ON [t5].[EstimateRequestID] = [t4].[ID] 
       WHERE [t4].[EstimateID] = [t3].[ID] 
       ) AS [value], [t2].[ID], [t3].[RepresentationID], [t3].[SegmentID] 
      FROM [dbo].[Representations] AS [t2], [dbo].[Estimates] AS [t3] 
      ) AS [t6] 
     WHERE ([t6].[ID] = [t1].[RepresentationID]) AND ([t6].[RepresentationID] = [t6].[ID]) 
     GROUP BY [t6].[SegmentID] 
     ) AS [t7] 
    ) AS [Estimate], (
    SELECT COUNT(*) 
    FROM [dbo].[Leaves] AS [t8] 
    WHERE [t8].[BranchID] = [t0].[ID] 
    ) AS [value] 
FROM [dbo].[Branches] AS [t0] 
LEFT OUTER JOIN [dbo].[Leaves] AS [t1] ON [t1].[BranchID] = [t0].[ID] 
WHERE [t0].[LockedBy] = @p0 
ORDER BY [t0].[ID], [t1].[ID] <-- Here's the unnecessary ORDER BY 
+0

どのようにして注文が成績を傷つけるのか分かりますか? – Jeff

+0

LINQ2SQLは、INNER結合で十分であるLEFT OUTER JOINを生成するという厄介な習慣があります。この方法の唯一の方法は、結合を手動で記述し、生成された関連付けに依存しないことです。それはバグかもしれないし、何か...私はこの余分な "オーダー"で同じアプローチを試してみることをお勧めします - ちょうど結合を書き出し、違いがあるかどうかを見てください。 –

+0

ジェフ、あなたは正しいわ私はわかりません、私はこの「順序付け」が冗長であることを知っています、そして、私はそれがそこにあることを望んでいません... – Lu4

答えて

1

にレンダリングします。 (子供のコレクションがあるたびにorder byがあります)

+0

私は理解しています... – Lu4

+0

最初の注文は必要ですが、まだ見えません。なぜ2番目の注文が必要なのですか? – QrystaL