2017-10-20 2 views
0

J'essaie d'extraire des données via une requête de lien dans ce format.Requête Linq pour extraire Détail à partir de plusieurs lignes de même ID d'une table

ID | Name | PHD | MPhill | MS/Msc 
++++++++++++++++++++++++++++++++++++++++++ 
1 | abc  | Botany | Botany | - 
2 | xyz  | Zoology| -  | Zoology 

Mon tableau des employés est:

ID | Name 
+++++++++++ 
1 | abc 
2 | xyz 

Table EmpAcademic Infor est:

ID | Emp_ref_id | Program_ref_id | Subject 
+++++++++++++++++++++++++++++++++++++++++++ 
1 | 1   | 1    | Botony 
2 | 1   | 2    | Botony 
3 | 2   | 1    | Zoology 
4 | 2   | 3    | Zoology 

Table programme est aussi:

ID | Name 
+++++++++++ 
1 | PhD 
2 | MPhill 
3 | MS/MSc 

Voici ma requête LINQ

var result = (from p in Context.tblEmployees 
          join o in Context.tblEmpOfficialInfoes on p.ID equals o.Emp_ref_id 
          join a in Context.tblEmpAcademicQualifs on p.ID equals a.Emp_ref_id 
          join pro in Context.tblPrograms on a.Program_ref_id equals pro.ID 
          where pro.ID == 4 
          select new 
          { 
           p.LName, 
           pro.Name, 
           a.Subject 
          }); 

Mais cela n'extrait que les détails des employés qui ont fait leur doctorat. et comment puis-je extraire Mphill, MS/MSc sujets le long du doctorat. et les valeurs nulles des degrés.

Répondre

0

Essayez cette solution:

var result = (from ea in Context.EmpAcademics 
       join emp in Context.Employees 
       on ea.Emp_ref_id equals emp.ID 
       join prog in Context.Programs 
       on ea.Program_ref_id equals prog.ID 
       group new {prog, ea} by new {emp.ID, emp.Name} into gr 
       select new { 
        gr.Key.ID, 
        gr.Key.Name, 
        PHD = gr.Where(x => x.prog.Name == "PHD") 
          .Select(x => x.ea.Subject).FirstOrDefault(), 
        MPhill = gr.Where(x => x.prog.Name == "MPhill") 
          .Select(x => x.ea.Subject).FirstOrDefault(), 
        MS_Msc = gr.Where(x => x.prog.Name == "MS/Msc") 
          .Select(x => x.ea.Subject).FirstOrDefault() 
       }).ToList();