0

Я следующий SQL Query и хотел бы преобразовать в LINQ к SQL, которые я буду использовать в рамках объекта 5,0Как преобразовать следующий SQL-запрос в LINQ к SQL запроса

var internationalDesksList = 
      from internationalDesks in _context.InternationalDesks 
      from subsection in 
       _context.Subsections.Where(
        s => 
        internationalDesks.EBALocationId == s.LocationId || 
        internationalDesks.FELocationId == s.LocationId).DefaultIfEmpty() 
      where subsection.PublicationId == 1 

      select new {internationalDesks.Id, subsection.LocationId}; 

я упомянул следующие сообщения и ответы. Хотя не повезло.

Когда я попробовал этот запрос в LINQPad я получил следующий ответ, который является правильным.

-- Region Parameters 
DECLARE @p0 Int = 1 
-- EndRegion 
SELECT [t0].[Id], [t1].[Id] AS [Id1] 
FROM [InternationalDesks] AS [t0] 
LEFT OUTER JOIN [Subsection] AS [t1] ON (([t0].[FELocationId]) = [t1].[LocationId]) OR (([t0].[EBALocationId]) = [t1].[LocationId]) 
WHERE [t1].[PublicationId] = @p0 

Однако в инфраструктуре сущности 5 (DBContext) он не дает мне правильный запрос. Когда я проверил в профилировщике SQL, все столбцы в таблице подраздела выбраны. Вот и все.

Ниже приводится результат:

SELECT 
[Extent1].[Id] AS [Id], 
[Extent1].[Description] AS [Description], 
[Extent1].[PracticeAreaId] AS [PracticeAreaId], 
[Extent1].[LocationId] AS [LocationId], 
... 
FROM [dbo].[Subsection] AS [Extent1] 

Не знаю, что может быть проблемой. Пожалуйста, помогите мне.

+0

Просьба LINQ запрос, который вы используете –

+0

@lazyberezovsky спасибо, я обновил с LINQ Query. – Elangesh

ответ

0

С LINQ вы не можете делать LEFT OUTER JOIN на каком-то булевом выражении, поддерживаются только equijoins. Таким образом, вы можете создать CROSS JOIN следующим образом:

var internationalDesksList = 
      from internationalDesks in _context.InternationalDesks 
      from subsection in _context.Subsections 
      where subsection.PublicationId == 1 && 
        (internationalDesks.EBALocationId == subsection.LocationId || 
        internationalDesks.FELocationId == subsection.LocationId) 
      select new { 
       internationalDesks.Id, 
       subsection.LocationId 
      }; 

EF 5 сгенерирует следующий SQL:

SELECT 
[Extent1].[Id] AS [Id], 
[Extent2].[LocationId] AS [LocationId] 
FROM [dbo].[InternationalDesks] AS [Extent1] 
CROSS JOIN [dbo].[Subsections] AS [Extent2] 
WHERE (1 = [Extent2].[PublicationId]) AND 
     ([Extent1].[EBALocationId] = [Extent2].[LocationId] OR 
     [Extent1].[FELocationId] = [Extent2].[LocationId]) 

Как вы можете видеть, выбраны только необходимые столбцы. Я также проверил этот запрос в LINQ к SQL - следующий запрос генерируется:

DECLARE @p0 Int = 1 

SELECT [t0].[Id], [t1].[LocationId] 
FROM [InternationalDesks] AS [t0], [Subsections] AS [t1] 
WHERE ([t1].[PublicationId] = @p0) AND 
     (([t0].[EBALocationId] = [t1].[LocationId]) OR 
     ([t0].[FELocationId] = [t1].[LocationId])) 
+0

lazyberezovsky, он добавляет условие в where where, где мне нужно их часть левого соединения. - область Параметры DECLARE @ р0 Int = 223 -.. EndRegion SELECT [t0] [Id], [t1] [LocationId] ОТ [InternationalDesks] AS [t0], [Подраздел] AS [t1] WHERE ([t1]. [PublicationId] = @ p0) AND ((([t0]. [EBALocationId]) = [t1]. [LocationId]) OR (([t0]. [FELocationId]) = [t1] . [LocationId])) – Elangesh

+0

@Elangesh у вас не может быть условий как часть левого соединения. Это невозможно сделать с LINQ –