2016-04-09 5 views
1
//This is student model 
namespace StudentApp.Models 
{ 
    public class Student 
    { 
     [Key] 
     public int studentId { get; set; } 
     public List<AssignedSupervisor> assigned_supervisorId { get; set; } 
    } 
    public class AssignedSupervisor 
    { 
     [Key] 
     public int supervisorId { get; set; } 
    } 
} 

Basierend auf dem Schülermodell, Entity Framework erstellt die folgenden dbVerwenden Linq mehrere Werte mit DTO

//Here is the sample db structure 
//Table Students 
studentId 
--------- 
    1 
    2 
//Table Supervisors 
supervisorId | studentId 
------------ --------- 
    101   1 
    102   1 
    105   2 

StudentID ist ein Fremdschlüssel in den Supervisor Tabelle zurückzukehren. Studenten können einen oder mehrere Supervisor zugewiesen bekommen. Erforderliche Ausgabe sollte auf das folgende Beispiel ähnelt:

{ 
    "studentId": "1", 
    "supervisorId": [101,102] 
}, 
{ 
    "studentId": "2", 
    "supervisorId": [105] 
} 

Unten ist die DTO

//This is student DTO 
namespace StudentApp.DTOs 
{ 
    public class StudentDTO 
    { 
     public int studentId { get; set; } 
     public List<AssignedSupervisor> assigned_supervisorId { get; set; } 
    } 
} 

In meinem Controller

namespace ContractingApp.Controllers 
{ 
    //first way I'm doing which returns ugly JSON. 
    public List<StudentDTO> GetStudents() 
    { 
     return db.Students.Select(s => new StudentDTO() 
     { 
      studentId = s.studentId, 
      //Not sure how to use the select statement with it 
      assigned_supervisorId = s.Supervisors.Where(
       u => u.studentId == s.studentId 
       ).ToList() 
     }).ToList(); 
    } 

    //Another way I have tried after the suggestions by @darth_phoenixx I'm trying which doesn't return correct correct format either. 
    //It returns 3 JSON objects - one with each supervisor ID. 
    public List<dynamic> GetStudents() 
    { 
     var students = (from t1 in db.Students 
         join t2 in db.Supervisors on t1.studentId equals t2.studentId 
         select new 
         { 
          t1.studentId, 
          t2.supervisorId 
         }); 
     return students.ToList<dynamic>(); 
    } 
} 

Jeder Artikel oder Richtung wird zu lösen hilfreich sein.

+0

Haben Sie eine Tabelle mit den Details der Supervisor? Wenn ja, denke ich, dass Sie wahrscheinlich in einen Join schauen wollen - indem Sie die Studenten-Tabelle mit der Supervisor-Tabelle verbinden und den Supervisor aus der Datenbank herausholen, basierend auf der 'supervisor_internal_id'. Werfen Sie einen Blick auf [http://stackoverflow.com/questions/37324/what-is-the-syntax-for-an-inner-join-in-linq-to-sql](http://stackoverflow.com/ Fragen/37324/Was-ist-die-Syntax-für-eine-innere-join-in-linq-to-sql) –

+0

@darth_phoenixx - Danke für die Hilfe und den Link. Ich habe versucht, Join zu verwenden, aber es gibt das JSON nicht im erwarteten Format zurück. Ich habe meine Frage mit einem Beispiel für das erforderliche Format aktualisiert. Bitte schau. Ich bin gerne bereit, weitere Informationen zur Verfügung zu stellen. Das größte Problem, vor dem ich stehe, ist, die richtigen Worte zu finden, um es zu erklären. :) – sandiejat

Antwort

0

Ich habe einen Hinweis auf Stackoverflow gefunden. Danke an @Aducci für die Beantwortung einer Frage auf Mapping Linq Query results to a DTO class

Das Problem war mit meinen DTOs. Die richtige DTO sollte sein:

//SupervisorId is in another DTO and has the correct data type as it is in the DB. 
namespace StudentApp.DTOs 
{ 
    public class StudentDTO 
    { 
     public int studentId { get; set; } 
     public IEnumerable<SupervisorDTO> assigned_supervisorId { get; set; } 
     //assigned_supervisorId in Student Model needs to be IEnumerable to work with this change in DTO. 
    } 
    //Separate DTO for supervisor 
    public class SupervisorDTO 
    { 
     public int supervisorId { get; set; } 
    } 
} 

Sobald der DTO sortiert wurde, die Antwort Stackoverflow dazu beigetragen, die ‚Verkettung‘ der Abfragen in immer getan. Für jede Abfrage muss das zugehörige DTO verwendet werden. Und hier ist der letzte Controller in meinem WebAPI. (db ist das Objekt des Entity Framework)

public IEnumerable<StudentDTO> GetStudents() 
{ 
    return (from t1 in db.Students 
      select new StudentDTO() 
      { 
       studentId = t1.StudentId, 
       assigned_supervisorId = (from t2 in db.Supervisors 
           where t1.StudentId == t2.StudentId 
           select new SupervisorDTO() // Supervisor DTO needs to be used here 
           { 
            supervisorId = t2.supervisorId 
           }) 
      }); 
}