1

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();

0 Answers0