2011-07-26 16 views
2

のJOIN生産これは、このLINQクエリを形成するための最良の方法であるかどうかは知らないが、私はただのアドバイスは歓迎ですので、始めますよ。LINQのLEFT OUTERは

私は「アイテムサイジング属性のwaisteサイズプロパティが32である任意のattibutesを持っている任意の項目を持つレポート」を言うと思います次のクエリレポートのロケーションキー、ID、および名前を返します。 (場所は、レポートの外部キーです)

これは、望ましい結果をもたらしますが、SQLは私には当てはまりません。 ... LEFT OUTERはそれだけで最初INNERからそれを得ていることができるとき、同じテーブルにJOINを、場所の名前を取得するには、JOIN時間

SELECT [Extent1].[ReportKey] AS [ReportKey], 
     [Extent2].[LocationID] AS [LocationID], 
     [Extent3].[LocationName] AS [LocationName] 
FROM [Info].[Report] AS [Extent1] 
INNER JOIN [Info].[Location] AS [Extent2] 
ON [Extent1].[LocationKey] = [Extent2].[LocationKey] 
LEFT OUTER JOIN [Info].[Location] AS [Extent3] 
ON [Extent1].[LocationKey] = [Extent3].[LocationKey] 
WHERE EXISTS 
(SELECT 1 AS [C1] 
FROM (SELECT [Extent4].[ReportItemKey] AS [ReportItemKey] 
     FROM [Info].[ReportItems] AS [Extent4] 
     WHERE [Extent1].[ReportKey] = [Extent4].[ReportKey] 
    ) AS [Project1] 
WHERE EXISTS (SELECT 1 AS [C1] 
     FROM [Info].[ItemAttributes] AS [Extent5] 
     INNER JOIN [Info].[Attributes] AS [Extent6] 
        ON [Extent5].[AttributeKey] = [Extent6].[AttributeKey] 
     WHERE ([Project1].[ReportItemKey] = [Extent5].[ReportItemKey]) 
        AND ([Extent6].[WaistSize] = @p__linq__0) 
      ) 
) 

感謝を注意してください。

答えて

1

したい場合は、内側はあなたがselect文でx.Location.IDは、エンティティの場所に移動することで、それはどうかを確認しないと言って書いたものを、この

from x in ctx.Reports 
join y in ctx.Locations 
on x.LocationKey equals y.ID 
where x.ReportItems.Any(y => 
     y.ItemAttributes.Any(z => 
      z.Sizing.WaistSize == 32)) 
    select new { x.Key, y.ID, y.Name }; 

のようなものを記述する必要があります参加あなたはx.Locationnullある状況を扱っているかどうか、それはちょうどあなたがもしレポートがあなたのコードが壊れる場所を持っていないことを知っていることを前提としています。

関連する問題