2008-11-25 6 views
1

J'ai cette requête dans LINQ to Entities. Je sais que c'est une sorte de requête "Evil" mais elle n'est utilisée que dans une interface d'administration. Mais le SQL généré est absolument horrifiant. Jetez un oeil à ce bébé.Optimize Grouper par dans LINQ to Entities


exec sp_executesql N'SELECT TOP (50) 
[Project6].[C1] AS [C1], 
[Project6].[TopicId] AS [TopicId], 
[Project6].[C4] AS [C2], 
[Project6].[subject] AS [subject], 
[Project6].[name] AS [name], 
[Project6].[forumName] AS [forumName], 
[Project6].[C2] AS [C3] 
FROM (SELECT 
    [Project5].[TopicId] AS [TopicId], 
    [Project5].[subject] AS [subject], 
    [Project5].[forumName] AS [forumName], 
    [Project5].[name] AS [name], 
    1 AS [C1], 
    CAST([Project5].[forumID] AS int) AS [C2], 
    [Project5].[C1] AS [C3], 
    [Project5].[C2] AS [C4] 
    FROM (SELECT 
     [Project4].[TopicId] AS [TopicId], 
     [Project4].[forumID] AS [forumID], 
     [Project4].[subject] AS [subject], 
     [Project4].[forumName] AS [forumName], 
     [Project4].[name] AS [name], 
     [Project4].[C1] AS [C1], 
     (SELECT 
      COUNT(cast(1 as bit)) AS [A1] 
      FROM  [dbo].[tForumStats] AS [Extent14] 
      LEFT OUTER JOIN [dbo].[tTopic] AS [Extent15] ON [Extent14].[TopicId] = [Extent15].[topicID] 
      LEFT OUTER JOIN [dbo].[tForum] AS [Extent16] ON [Extent15].[forumID] = [Extent16].[forumID] 
      LEFT OUTER JOIN [dbo].[tForum] AS [Extent17] ON [Extent15].[forumID] = [Extent17].[forumID] 
      LEFT OUTER JOIN [dbo].[tForum] AS [Extent18] ON [Extent15].[forumID] = [Extent18].[forumID] 
      LEFT OUTER JOIN [dbo].[tForumGroup] AS [Extent19] ON [Extent18].[forumGroupID] = [Extent19].[forumGroupID] 
      LEFT OUTER JOIN [dbo].[tForum] AS [Extent20] ON [Extent15].[forumID] = [Extent20].[forumID] 
      LEFT OUTER JOIN [dbo].[tForumGroup] AS [Extent21] ON [Extent20].[forumGroupID] = [Extent21].[forumGroupID] 
      WHERE ([Extent14].[LogDate] >= @p__linq__25) AND ([Extent14].[LogDate] = @p__linq__25) AND ([Extent6].[LogDate] = @p__linq__25) AND ([Extent1].[LogDate]

je ne sais pas que quiconque d'expliquer cette requête, mais ce serait bien d'obtenir quelques conseils sur la façon de optimze la requête afin qu'il ne juste un régulier simple, rejoindre. Quelque chose comme ça fonctionne aussi bien si j'écris le SQL moi-même.

SELECT COUNT(*) AS NumberOfViews, s.topicid AS topicId, t.subject AS TopicSubject, g.[name] AS ForumGroupName, f.forumName AS ForumName 
FROM tForumStats s 
join tTopic t on s.topicid = t.topicid 
join tForum f on f.forumid = t.forumid 
JOIN tForumGroup g ON f.forumGroupID = g.forumGroupID 
WHERE s.[LogDate] between @date1 AND @date2 
group by s.topicid, t.subject, f.Forumname, t.Datum, g.[name] 
order by count(*) desc 

Btw, j'aime ce site. Conception étonnante et convivialité! Espérons que cela fonctionne bien pour obtenir de l'aide à :)

+0

Hope, ressemble le site a coupé la grande requête générée bu Linq à ENTITES, je ne vous blâme pas. Je pense que vous avez l'idée .. – Olaj

Répondre

5

Au lieu de se joindre à toutes les tables dans le groupe par vous pouvez joindre les tables données par vous-même. Pouvez-vous essayer cela? Ps: Il peut y avoir quelques erreurs, mais logiquement, il devrait être correct!

+0

Merci, je n'arrive pas à faire une jointure. L'ancienne LINQ à SQL chemin où vous venez d'ajouter plusieurs des clauses comme de s dans db.ForumStatsSet de t s.Topic travail Doesnt et je n'ai pas ID de faire la jointure sur, puisque c'est « retiré » acheter le modèle .. hmm .. im confus .. – Olaj

+0

résolu le problème maintenant, je l'ai fait la jonction dans le mauvais ordre .. – Olaj

0

Je pense que le problème est lié à la construction de regroupement. Essayez d'extraire les données en premier (il n'est donc pas nécessaire de passer par les propriétés), puis regroupez les données extraites.

OIEau, essayez d'écrire le LINQ comme le ferait pour le SQL.