2008-11-25 39 views
1

我在LINQ to Entities中有這個查詢。在LINQ to Entities中優化分組

 var query = (from s in db.ForumStatsSet 
        where s.LogDate >= date1 && s.LogDate <= date2 
        group s by new { s.Topic.topicID, s.Topic.subject, s.Topic.Forum.forumName, s.Topic.datum, s.Topic.Forum.ForumGroup.name, s.Topic.Forum.forumID } into g 
        orderby g.Count() descending 
        select new TopicStatsData 
        { 
         TopicId = g.Key.topicID, 
         Count = g.Count(), 
         Subject = g.Key.subject, 
         ForumGroupName = g.Key.name, 
         ForumName = g.Key.forumName, 
         ForumId = g.Key.forumID 
        }); 

我知道這是一種「邪惡」的查詢,但它只用於管理界面。但是它產生的SQL絕對是令人恐懼的。看看這個寶貝。


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]

我不爲任何人解釋,查詢,但是這將是巨大的獲取有關如何將進而優化查詢一些技巧,以便它只是做一個簡單的常規連接。如果我自己編寫SQL,這樣的工作很好。

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 

順便說一句,我愛這個網站。驚人的設計和可用性!希望它能很好地得到一些幫助:)

+0

希望,看起來像網站削減了大量查詢生成bu林克引誘,我不怪你。我想你明白了.. – Olaj 2008-11-25 13:17:19

回答

5

您可以自己加入給定的表格,而不是通過加入組中的所有表格。 你可以試試這個;

from s in db.ForumStatsSet 
join t in db.Topics on t.TopicId == s.TopicId 
join f in db.Forums on f.ForumId == t.ForumId 
join fg in db.ForumGroups on fg.ForumGroupId == f.ForumGroupId 
where s.LogDate >= date1 && s.LogDate <= 
group s by new { t.TopicId, t.subject, f.forumName, t.datum, fg.name, f.forumID } into g 
orderby g.Count() descending 
select new TopicStatsData 
{ 
TopicId = g.Key.topicID, 
Count = g.Count(), 
Subject = g.Key.subject, 
ForumGroupName = g.Key.name, 
ForumName = g.Key.forumName, 
ForumId = g.Key.forumID 
}); 

ps:可能有一些錯誤,但在邏輯上應該是正確的!

+0

謝謝,我無法設法做一個加入。舊的LINQ到SQL的方式,你只是從s從db.ForumStatsSet 從s中添加多個子句 從012. 不工作,買模型..嗯..即時通訊困惑.. – Olaj 2008-11-25 14:05:27

0

我認爲問題是與分組構造。先嚐試提取數據(因此不需要通過屬性),然後按提取的數據進行分組。

IOW,請嘗試爲SQL編寫LINQ。