2017-08-14 79 views
-1

我无法理解,在下面的代码和我All功能功能只想写这下面的查询SQL存储过程..如何的LINQ查询转换为SQL查询

IQueryable<Situation> situations = db.Situations 
      .Include("SituationHandicap") 
      .Include("SituationAttributes") 
      .Where(x => 
       x.Deleted == false && 
       x.Published == true && 
       x.SituationCategory.Id == C 
       && (A.All(a => x.SituationAttributes.Any(sa => a == sa.AttributesId)) || 
       A.Any(a => x.SituationAttributes.Any(sa => a == sa.AttributesId))) 
      && (H.All(a => x.SituationHandicap.Any(sa => a == sa.HandicapId)) || 
      H.Any(a => x.SituationHandicap.Any(sa => a == sa.HandicapId))) 
      ); 

我只是混淆到位。所有()在SQL方法中使用什么......请回答

我刚刚发现LINQ查询的实体框架生成的SQL查询是太长如下

SELECT 
    [UnionAll1].[Id] AS [C1], 
    [UnionAll1].[Id1] AS [C2], 
    [UnionAll1].[Name] AS [C3], 
    [UnionAll1].[YdsToPin] AS [C4], 
    [UnionAll1].[WindSpeed] AS [C5], 
    [UnionAll1].[Elevation] AS [C6], 
    [UnionAll1].[WindDirection] AS [C7], 
    [UnionAll1].[startCoordinate] AS [C8], 
    [UnionAll1].[pinCoordinate] AS [C9], 
    [UnionAll1].[targetCoordinate] AS [C10], 
    [UnionAll1].[lineType] AS [C11], 
    [UnionAll1].[Published] AS [C12], 
    [UnionAll1].[Unpublished] AS [C13], 
    [UnionAll1].[Deleted] AS [C14], 
    [UnionAll1].[Book_Id] AS [C15], 
    [UnionAll1].[ImageFile_Id] AS [C16], 
    [UnionAll1].[SituationCategory_Id] AS [C17], 
    [UnionAll1].[C1] AS [C18], 
    [UnionAll1].[Id2] AS [C19], 
    [UnionAll1].[SituationId] AS [C20], 
    [UnionAll1].[HandicapId] AS [C21], 
    [UnionAll1].[C2] AS [C22], 
    [UnionAll1].[C3] AS [C23], 
    [UnionAll1].[C4] AS [C24] 
    FROM (SELECT 
     CASE WHEN ([Extent2].[Id] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C1], 
     [Extent1].[Id] AS [Id], 
     [Extent1].[Id] AS [Id1], 
     [Extent1].[Name] AS [Name], 
     [Extent1].[YdsToPin] AS [YdsToPin], 
     [Extent1].[WindSpeed] AS [WindSpeed], 
     [Extent1].[Elevation] AS [Elevation], 
     [Extent1].[WindDirection] AS [WindDirection], 
     [Extent1].[startCoordinate] AS [startCoordinate], 
     [Extent1].[pinCoordinate] AS [pinCoordinate], 
     [Extent1].[targetCoordinate] AS [targetCoordinate], 
     [Extent1].[lineType] AS [lineType], 
     [Extent1].[Published] AS [Published], 
     [Extent1].[Unpublished] AS [Unpublished], 
     [Extent1].[Deleted] AS [Deleted], 
     [Extent1].[Book_Id] AS [Book_Id], 
     [Extent1].[ImageFile_Id] AS [ImageFile_Id], 
     [Extent1].[SituationCategory_Id] AS [SituationCategory_Id], 
     [Extent2].[Id] AS [Id2], 
     [Extent2].[SituationId] AS [SituationId], 
     [Extent2].[HandicapId] AS [HandicapId], 
     CAST(NULL AS int) AS [C2], 
     CAST(NULL AS int) AS [C3], 
     CAST(NULL AS int) AS [C4] 
     FROM [dbo].[Situations] AS [Extent1] 
     LEFT OUTER JOIN [dbo].[SituationHandicaps] AS [Extent2] ON [Extent1].[Id] = [Extent2].[SituationId] 
     WHERE (0 = [Extent1].[Deleted]) AND (1 = [Extent1].[Published]) AND ([Extent1].[SituationCategory_Id] = 1) AND ((NOT EXISTS (SELECT 
      1 AS [C1] 
      FROM (SELECT 
       36 AS [C1] 
       FROM (SELECT 1 AS X) AS [SingleRowTable1] 
      ) AS [Project1] 
      WHERE (NOT EXISTS (SELECT 
       1 AS [C1] 
       FROM [dbo].[SituationAttributes] AS [Extent3] 
       WHERE ([Extent1].[Id] = [Extent3].[SituationId]) AND ([Project1].[C1] = [Extent3].[AttributesId]) 
      )) OR (CASE WHEN (EXISTS (SELECT 
       1 AS [C1] 
       FROM [dbo].[SituationAttributes] AS [Extent4] 
       WHERE ([Extent1].[Id] = [Extent4].[SituationId]) AND ([Project1].[C1] = [Extent4].[AttributesId]) 
      )) THEN cast(1 as bit) ELSE cast(0 as bit) END IS NULL) 
     )) OR (EXISTS (SELECT 
      1 AS [C1] 
      FROM (SELECT 
       36 AS [C1] 
       FROM (SELECT 1 AS X) AS [SingleRowTable2] 
      ) AS [Project5] 
      WHERE EXISTS (SELECT 
       1 AS [C1] 
       FROM [dbo].[SituationAttributes] AS [Extent5] 
       WHERE ([Extent1].[Id] = [Extent5].[SituationId]) AND ([Project5].[C1] = [Extent5].[AttributesId]) 
      ) 
     ))) AND ((NOT EXISTS (SELECT 
      1 AS [C1] 
      FROM (SELECT 
       1 AS [C1] 
       FROM (SELECT 1 AS X) AS [SingleRowTable3] 
      ) AS [Project8] 
      WHERE (NOT EXISTS (SELECT 
       1 AS [C1] 
       FROM [dbo].[SituationHandicaps] AS [Extent6] 
       WHERE ([Extent1].[Id] = [Extent6].[SituationId]) AND ([Project8].[C1] = [Extent6].[HandicapId]) 
      )) OR (CASE WHEN (EXISTS (SELECT 
       1 AS [C1] 
       FROM [dbo].[SituationHandicaps] AS [Extent7] 
       WHERE ([Extent1].[Id] = [Extent7].[SituationId]) AND ([Project8].[C1] = [Extent7].[HandicapId]) 
      )) THEN cast(1 as bit) ELSE cast(0 as bit) END IS NULL) 
     )) OR (EXISTS (SELECT 
      1 AS [C1] 
      FROM (SELECT 
       1 AS [C1] 
       FROM (SELECT 1 AS X) AS [SingleRowTable4] 
      ) AS [Project12] 
      WHERE EXISTS (SELECT 
       1 AS [C1] 
       FROM [dbo].[SituationHandicaps] AS [Extent8] 
       WHERE ([Extent1].[Id] = [Extent8].[SituationId]) AND ([Project12].[C1] = [Extent8].[HandicapId]) 
      ) 
     ))) 
    UNION ALL 
     SELECT 
     2 AS [C1], 
     [Extent9].[Id] AS [Id], 
     [Extent9].[Id] AS [Id1], 
     [Extent9].[Name] AS [Name], 
     [Extent9].[YdsToPin] AS [YdsToPin], 
     [Extent9].[WindSpeed] AS [WindSpeed], 
     [Extent9].[Elevation] AS [Elevation], 
     [Extent9].[WindDirection] AS [WindDirection], 
     [Extent9].[startCoordinate] AS [startCoordinate], 
     [Extent9].[pinCoordinate] AS [pinCoordinate], 
     [Extent9].[targetCoordinate] AS [targetCoordinate], 
     [Extent9].[lineType] AS [lineType], 
     [Extent9].[Published] AS [Published], 
     [Extent9].[Unpublished] AS [Unpublished], 
     [Extent9].[Deleted] AS [Deleted], 
     [Extent9].[Book_Id] AS [Book_Id], 
     [Extent9].[ImageFile_Id] AS [ImageFile_Id], 
     [Extent9].[SituationCategory_Id] AS [SituationCategory_Id], 
     CAST(NULL AS int) AS [C2], 
     CAST(NULL AS int) AS [C3], 
     CAST(NULL AS int) AS [C4], 
     [Extent10].[Id] AS [Id2], 
     [Extent10].[SituationId] AS [SituationId], 
     [Extent10].[AttributesId] AS [AttributesId] 
     FROM [dbo].[Situations] AS [Extent9] 
     INNER JOIN [dbo].[SituationAttributes] AS [Extent10] ON [Extent9].[Id] = [Extent10].[SituationId] 
     WHERE (0 = [Extent9].[Deleted]) AND (1 = [Extent9].[Published]) AND ([Extent9].[SituationCategory_Id] = 1) AND ((NOT EXISTS (SELECT 
      1 AS [C1] 
      FROM (SELECT 
       36 AS [C1] 
       FROM (SELECT 1 AS X) AS [SingleRowTable5] 
      ) AS [Project16] 
      WHERE (NOT EXISTS (SELECT 
       1 AS [C1] 
       FROM [dbo].[SituationAttributes] AS [Extent11] 
       WHERE ([Extent9].[Id] = [Extent11].[SituationId]) AND ([Project16].[C1] = [Extent11].[AttributesId]) 
      )) OR (CASE WHEN (EXISTS (SELECT 
       1 AS [C1] 
       FROM [dbo].[SituationAttributes] AS [Extent12] 
       WHERE ([Extent9].[Id] = [Extent12].[SituationId]) AND ([Project16].[C1] = [Extent12].[AttributesId]) 
      )) THEN cast(1 as bit) ELSE cast(0 as bit) END IS NULL) 
     )) OR (EXISTS (SELECT 
      1 AS [C1] 
      FROM (SELECT 
       36 AS [C1] 
       FROM (SELECT 1 AS X) AS [SingleRowTable6] 
      ) AS [Project20] 
      WHERE EXISTS (SELECT 
       1 AS [C1] 
       FROM [dbo].[SituationAttributes] AS [Extent13] 
       WHERE ([Extent9].[Id] = [Extent13].[SituationId]) AND ([Project20].[C1] = [Extent13].[AttributesId]) 
      ) 
     ))) AND ((NOT EXISTS (SELECT 
      1 AS [C1] 
      FROM (SELECT 
       1 AS [C1] 
       FROM (SELECT 1 AS X) AS [SingleRowTable7] 
      ) AS [Project23] 
      WHERE (NOT EXISTS (SELECT 
       1 AS [C1] 
       FROM [dbo].[SituationHandicaps] AS [Extent14] 
       WHERE ([Extent9].[Id] = [Extent14].[SituationId]) AND ([Project23].[C1] = [Extent14].[HandicapId]) 
      )) OR (CASE WHEN (EXISTS (SELECT 
       1 AS [C1] 
       FROM [dbo].[SituationHandicaps] AS [Extent15] 
       WHERE ([Extent9].[Id] = [Extent15].[SituationId]) AND ([Project23].[C1] = [Extent15].[HandicapId]) 
      )) THEN cast(1 as bit) ELSE cast(0 as bit) END IS NULL) 
     )) OR (EXISTS (SELECT 
      1 AS [C1] 
      FROM (SELECT 
       1 AS [C1] 
       FROM (SELECT 1 AS X) AS [SingleRowTable8] 
      ) AS [Project27] 
      WHERE EXISTS (SELECT 
       1 AS [C1] 
       FROM [dbo].[SituationHandicaps] AS [Extent16] 
       WHERE ([Extent9].[Id] = [Extent16].[SituationId]) AND ([Project27].[C1] = [Extent16].[HandicapId]) 
      ) 
     )))) AS [UnionAll1] 
    ORDER BY [UnionAll1].[Id1] ASC, [UnionAll1].[C1] ASC 

它的工作,但这不是一个好办法,请建议

+1

你试过了什么?你试图自己写存储过程的地方在哪里? – pquest

+0

目前还不清楚你的问题是什么。避免要求我们为你做你的工作。先尝试一些东西。请参阅帮助https://stackoverflow.com/help/how-to-ask –

+0

这是我查询存储过程'select * from [dbo]。[Situations] as s left join [dbo]。[SituationAttributes] as sa on s.Id = sa.SituationId left join [dbo]。[SituationHandicaps] as sh on s.Id = sh.SituationId where published = 1 and Deleted = 0 and SituationCategory_Id = 1' –

回答

0

对于.All()你可以使用NOT EXISTS子查询。 EG这个查询返回具有所有OrderLines订单与单价> = 2

select * 
from Sales.Orders o 
where not exists 
    (
    select * 
    from Sales.OrderLines 
    where OrderId = o.OrderId 
     and UnitPrice < 2.00 
) 
+0

是否可以重写上面的SQL –

+0

可能,但为什么不直接运行它并捕获已翻译的SQL作为起点? –

+0

我编辑了Linq的问题和脓的SQL,它给出了正确的结果,但查询太长了 –

0

All()Any()完全是多余的。删除All和翻译:

select * 
from Situations x 
join SituationAttributes sa on x.Id = sa.SituationId 
join SituationHandicap sh on x.Id = sh.SituationId 
where NOT Deleted AND Published AND SituationCategory_Id = C AND 
EXISTS (SELECT 1 FROM SituationAttributes sa2 WHERE sa2.AttributesId in A) AND 
EXISTS (SELECT 1 FROM SituationHandicap sh2 WHERE sh2.HandicapId in H)