0

我有以下SQL查询,并想转换为LINQ到SQL我将在实体框架5.0如何转换下面的SQL查询转换为LINQ to 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

请提供您使用 –

+0

@lazyberezovsky谢谢,我已经与LINQ查询更新的LINQ查询。 – 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 to 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条款中我需要它们的部分左连接的条件。 - 区域参数 DECLARE @ p0 Int = 223 - EndRegion SELECT [t0]。[Id],[t1]。[LocationId] FROM [InternationalDesks] AS [t0],[Subsection] AS [t1] ([t0]。[FALocationId])= [t1]。[位置Id])OR(([t0]。[FELocationId])= [t1] 。[LocationId])) – Elangesh

+0

@Elangesh你不能有条件作为左连接的一部分。 LINQ是不可能的 –