2013-12-22 6 views
0

Я следующий LINQ запрос:Entity Framework 6 слишком много присоединяется

var query = from a in c.ArticleSet 
      where a.GlobalAccess == false && 
        a.Published == true && 
        a.MagazineSet.IsPublished == true && 
        a.MagazineSet.Press_Id == pressId && 
        a.Tests.Id==a.Id && 
        a.Tests.IsDeleted == false && 
        a.Tests.IsPublished == true 
      orderby a.Id descending 
      select a.Id; 

Это tranforms к SQL, как это:

ADO.NET:Execute Reader "SELECT 
[Project1].[Id] AS [Id] 
FROM (SELECT 
    [Filter3].[Id1] AS [Id] 
    FROM (SELECT [Filter2].[Id1], [Filter2].[Magazine_Id1], [Filter2].[Press_Id1], [Filter2].[Press_Id2], [Filter2].[Press_Id3] 
     FROM (SELECT [Filter1].[Id1], [Filter1].[Magazine_Id1], [Extent5].[Press_Id] AS [Press_Id1], [Extent6].[Press_Id] AS [Press_Id2], [Extent7].[Press_Id] AS [Press_Id3] 
      FROM  (SELECT [Extent1].[Id] AS [Id1], [Extent1].[Magazine_Id] AS [Magazine_Id1] 
       FROM [dbo].[ArticleSet] AS [Extent1] 
       INNER JOIN [dbo].[Tests] AS [Extent2] ON ([Extent1].[Id] = [Extent2].[Id]) AND ([Extent2].[Id] = [Extent1].[Id]) 
       INNER JOIN [dbo].[MagazineSet] AS [Extent3] ON [Extent1].[Magazine_Id] = [Extent3].[Id] 
       WHERE (0 = [Extent1].[GlobalAccess]) AND (1 = [Extent1].[Published]) AND (1 = [Extent3].[IsPublished])) AS [Filter1] 
      INNER JOIN [dbo].[MagazineSet] AS [Extent4] ON [Filter1].[Magazine_Id1] = [Extent4].[Id] 
      LEFT OUTER JOIN [dbo].[MagazineSet] AS [Extent5] ON [Filter1].[Magazine_Id1] = [Extent5].[Id] 
      LEFT OUTER JOIN [dbo].[MagazineSet] AS [Extent6] ON [Filter1].[Magazine_Id1] = [Extent6].[Id] 
      LEFT OUTER JOIN [dbo].[MagazineSet] AS [Extent7] ON [Filter1].[Magazine_Id1] = [Extent7].[Id] 
      INNER JOIN [dbo].[Tests] AS [Extent8] ON [Filter1].[Id1] = [Extent8].[Id] 
      WHERE 0 = [Extent8].[IsDeleted]) AS [Filter2] 
     INNER JOIN [dbo].[Tests] AS [Extent9] ON [Filter2].[Id1] = [Extent9].[Id] 
     INNER JOIN [dbo].[Tests] AS [Extent10] ON [Filter2].[Id1] = [Extent10].[Id] 
     WHERE 1 = [Extent10].[IsPublished]) AS [Filter3] 
    INNER JOIN [dbo].[Tests] AS [Extent11] ON [Filter3].[Id1] = [Extent11].[Id] 
    WHERE (([Filter3].[Press_Id1] = @p__linq__0) AND (NOT ([Filter3].[Press_Id2] IS NULL OR @p__linq__0 IS NULL))) OR (([Filter3].[Press_Id3] IS NULL) AND (@p__linq__0 IS NULL)) 
) AS [Project1] 
ORDER BY [Project1].[Id] DESC" 

Текст команды

"SELECT [Project1].[Id] AS [Id] 
FROM (SELECT 
    [Filter3].[Id1] AS [Id] 
    FROM (SELECT [Filter2].[Id1], [Filter2].[Magazine_Id1], [Filter2].[Press_Id1], [Filter2].[Press_Id2], [Filter2].[Press_Id3] 
     FROM (SELECT [Filter1].[Id1], [Filter1].[Magazine_Id1], [Extent5].[Press_Id] AS [Press_Id1], [Extent6].[Press_Id] AS [Press_Id2], [Extent7].[Press_Id] AS [Press_Id3] 
      FROM  (SELECT [Extent1].[Id] AS [Id1], [Extent1].[Magazine_Id] AS [Magazine_Id1] 
       FROM [dbo].[ArticleSet] AS [Extent1] 
       INNER JOIN [dbo].[Tests] AS [Extent2] ON ([Extent1].[Id] = [Extent2].[Id]) AND ([Extent2].[Id] = [Extent1].[Id]) 
       INNER JOIN [dbo].[MagazineSet] AS [Extent3] ON [Extent1].[Magazine_Id] = [Extent3].[Id] 
       WHERE (0 = [Extent1].[GlobalAccess]) AND (1 = [Extent1].[Published]) AND (1 = [Extent3].[IsPublished])) AS [Filter1] 
      INNER JOIN [dbo].[MagazineSet] AS [Extent4] ON [Filter1].[Magazine_Id1] = [Extent4].[Id] 
      LEFT OUTER JOIN [dbo].[MagazineSet] AS [Extent5] ON [Filter1].[Magazine_Id1] = [Extent5].[Id] 
      LEFT OUTER JOIN [dbo].[MagazineSet] AS [Extent6] ON [Filter1].[Magazine_Id1] = [Extent6].[Id] 
      LEFT OUTER JOIN [dbo].[MagazineSet] AS [Extent7] ON [Filter1].[Magazine_Id1] = [Extent7].[Id] 
      INNER JOIN [dbo].[Tests] AS [Extent8] ON [Filter1].[Id1] = [Extent8].[Id] 
      WHERE 0 = [Extent8].[IsDeleted]) AS [Filter2] 
     INNER JOIN [dbo].[Tests] AS [Extent9] ON [Filter2].[Id1] = [Extent9].[Id] 
     INNER JOIN [dbo].[Tests] AS [Extent10] ON [Filter2].[Id1] = [Extent10].[Id] 
     WHERE 1 = [Extent10].[IsPublished]) AS [Filter3] 
    INNER JOIN [dbo].[Tests] AS [Extent11] ON [Filter3].[Id1] = [Extent11].[Id] 
    WHERE (([Filter3].[Press_Id1] = @p__linq__0) AND (NOT ([Filter3].[Press_Id2] IS NULL OR @p__linq__0 IS NULL))) OR (([Filter3].[Press_Id3] IS NULL) AND (@p__linq__0 IS NULL)) 
) AS [Project1] 
ORDER BY [Project1].[Id] DESC 

Я думаю, что 3 join в этом примере достаточно. Почему инфраструктура Entity создает такой огромный запрос?

+2

Какой запрос вы хотите найти? – christiandev

+0

В таких ситуациях я предпочитаю писать соединения вручную - он создает лучший sql-код – Backs

ответ

0

Ваш запрос linq прекрасен, за исключением того факта, что он ссылается на множество таблиц сразу. Если это действительно то, чего вы хотите, там нечего бояться. Это не «суперэффективно», потому что вы ссылаетесь на 3 таблицы одновременно.

Просто помните, что SQL-запрос, созданный EF, является машинным. Это не всегда лучшее, но оно всегда должно быть абсолютно правильным. Я не уверен, почему он выбрал эту форму над другой, но если она работает, зачем беспокоиться?

Я всегда предлагаю, чтобы люди ограничивали свои запросы только справочными таблицами, в которых они нуждаются. По мере роста системы время обработки также увеличится, и с этим множеством табличных объединений он может стать более заметным.

Смежные вопросы