2010-03-23 55 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