2010-03-23 138 views
4

我正在尋找將此SQL語句翻譯成良好工作的&高性能LINQ命令。我設法使用分組計數和關鍵成員來處理第一個計數,但不知道如何獲得第二個計數。Linq,雙左連接和雙重計數

select main.title, count(details.id) as details, count(messages.id) as messages 
from main 
left outer join details on main.id = details.mainid 
left outer join messages on details.id = messages.detailid 
group by main.title 

這是我到目前爲止已經完成:

from main in Main 
join detail in Details on main.Id equals detail.MainId into j1 
from subdetail in j1.DefaultIfEmpty() 
group main by main.Title into g 
select new { Title = g.Key, Details = g.Count() } 

任何意見是值得歡迎的!

編輯:24/03/2010 09.41

這個查詢:

from main in Main 
join detail in Details on main.Id equals detail.MainId into j1 
from subdetail in j1.DefaultIfEmpty() 
join message in Messages on subdetail.Id equals message.DetailId into j2 
group main by main.Title into g 
select new { Title = g.Key, Details = g.Count() } 

生成此SQL語句:

SELECT COUNT(*) AS [Detail], [t0].[Title] 
FROM [Main] AS [t0] 
LEFT OUTER JOIN [Detail] AS [t1] ON [t0].[Id] = [t1].[MainId] 
LEFT OUTER JOIN [Messages] AS [t2] ON [t1].[Id] = [t2].[DetailId] 
GROUP BY [t0].[Title] 

所以,我幾乎做到了!

Fabian

+0

你可以發佈你迄今爲止做了什麼嗎? – 2010-03-23 21:20:03

+0

已添加。事實是,我正在計算多少標題分組,而不是我有多少細節。我仍在搜索;-) – 2010-03-24 08:22:16

回答

1

會不會這樣的工作?

from main in Main 
select new { 
    Title = main.Title, 
    Details = main.Details.Count(), 
    Messages = main.Details.Sum(d => d.Messages.Count()) 
} 

如果你有外鍵約束,LINQ應自動生成兒童的關係,所以你可以訪問與主要相關聯的每個細節main.Details,並main.Messages與主要關聯的每個消息。

+0

感謝您的回答,但它不能工作,因爲信息是一個細節的孩子。我的模式如下所示:Main 0 .. * Detail 0 .. * Messages。 – 2010-05-26 11:36:01

+0

確實 - 我的不好。那麼你可以總結所有細節的信息數量,不是嗎?我編輯了我的答案。自從3月份以來已經有一段時間了,可惜沒有人在早些時候撿到過。 – ANeves 2010-05-26 12:06:11