I have three tables as follows:
create table project_model(
id int auto_increment primary key,
name varchar(100) not null
);
create table project_model_phase(
id int auto_increment primary key,
mid int not null,
name varchar(100) not null,
foreign key(mid) references project_model(id)
);
create table project_model_procedure(
id int auto_increment primary key,
pid int not null,
foreign key(pid) references project_model_phase(id)
);
and some test records:
insert into project_model value (null, 'model-1');
insert into project_model_phase values (null, 1, 'phase-1'), (null, 1, 'phase-2');
insert into project_model_procedure values
(null, 1, 'procedure-1'),
(null, 1, 'procedure-2'),
(null, 2, 'procedure-3'),
(null, 2, 'procedure-4');
I would like to join the three tables and get the query result:
+----+--------------------+-------------+-----------------+
| id | name | phase-count | procedure-count |
+----+--------------------+-------------+-----------------+
| 1 | model-1 | 2 | 4 |
+----+--------------------+-------------+-----------------+
I can use SQL to get the above result:
select m.id, m.name, count(distinct p.name) phase-count, count(pp.id) procedure-count
from project_model m
join project_model_phase p on m.id = p.mid
join project_model_procedure pp on pp.pid = p.id group by m.id, m.name;
What would the equivalent LinQ statement be?
I use a very inefficient way to achieve my goal:
var query =
from n in context.ProjectModels
join p in context.ProjectModelPhases
on n.Id equals p.Mid
group n by n.Id into g
select new { id = g.Key, c = g.Count() };
var query2 =
from n in context.ProjectModels
join p in context.ProjectModelPhases
on n.Id equals p.Mid
join pp in context.ProjectModelProcedures
on p.Id equals pp.Pid
group n by n.Id into g
select new { id = g.Key, c = g.Count() };
var query3 =
(from n in context.ProjectModels
join p in query on n.Id equals p.id
join pp in query2 on n.Id equals pp.id
select new {n.Id, n.Name, cp = p.c, cpp = pp.c })
.ToList();