Linq против Entity Framework 4.1 Code Сначала создается LEFT OUTER JOIN - PullRequest
2 голосов
/ 27 июля 2011

Я не знаю, является ли это лучшим способом для формирования этого запроса linq, но я только начинаю, так что любые советы приветствуются.

Следующий запрос, я думаю, говорит: «Отчеты, которые имеютэлементы, у которых есть какие-либо атрибуты, в которых свойство waiste size размерного атрибута равно 32 ".вернуть ключ местоположения отчета, идентификатор и имя.(Местоположение является внешним ключом из отчета.)

        var rpts = from x in ctx.Reports
                   where x.ReportItems.Any(y =>
                       y.ItemAttributes.Any(z =>
                           z.Sizing.WaistSize == 32))
                   select new { x.Key, x.Location.ID, x.Location.Name };

Это дает желаемые результаты, но SQL мне не кажется правильным.Обратите внимание на ЛЕВОЕ НАРУЖНОЕ СОЕДИНЕНИЕ, чтобы получить Имя местоположения, когда оно могло только что получить его от первого ВНУТРЕННЕГО СОЕДИНЕНИЯ к той же таблице ...

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 Ответ

1 голос
/ 24 ноября 2011

Если вы хотите внутреннее соединение, вам нужно написать что-то вроде этого

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.Location.ID в операторе выбора, - это перейти к местоположению сущности, оно не проверяет, обрабатывали ли вы ситуацию, когда x.Location равно null, оно просто предполагает, что вы Знайте, что если в отчете нет местоположения, ваш код сломается.

...