2015-11-17 12 views
5

Ich habe diese Datenbank von EF-Code zuerst, und jetzt habe ich eine schwierige Zeit, meine Daten zu bekommen.ASP.NET linq Wählen Sie mit mehreren Joins

Ich habe folgende Einheiten:

Programm: ist ein Workout-Programm, das Workouts enthält.

Training: ist eine Tagesroutine, die eine Liste von Sets enthält.

Set: ist eine Übungen wiederholt x mal mit y laden.

Übung: ist eine Gymnastikübung, die eine Region enthält.

Region: ist eine Region des menschlichen Körpers und enthält Muskeln.

Muskel: ist ein Muskel auf den menschlichen Körper.

Modellbeispiele

Hier gibt es 3 Modellbeispiele

public class Workout 
{ 
    [Key] 
    public int WorkoutId { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public virtual ICollection<Set> Sets { get; set; } 
} 
public class Set 
{ 
    [Key] 
    public int SetId { get; set; } 
    //Foreign key for Exercise 
    public int ExerciseId { get; set; } 
    [ForeignKey("ExerciseId")] 
    public Exercise Exercise { get; set; } 
    public decimal Load { get; set; } 
    public decimal Order { get; set; } 
} 

    public class Exercise 
{ 
    [Key] 
    public int ExerciseId { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 
    //Foreign key for Region 
    public int RegionId { get; set; } 
    public Region Region { get; set; } 
} 

Und die eingerüstete Controller

// GET: api/Workouts 
    public IQueryable<Workout> GetWorkouts() 
    {   
     return db.Workouts; 
    } 

Damit mich nur mit seinen iCollection Sets ein Workout Objekt gibt, ist null.

Mit den Sets kann ich die entsprechenden Sets bekommen.

Aber was, wenn ich ein Training bekommen möchte, einschließlich der Sets, und diese Sets würden Übungen enthalten, und diese Übungen würden Regionen enthalten, die am Ende eine Liste von Muskeln hatten?

Und was ist, wenn ich ein Training von id wollen, wie folgt aus:

 [ResponseType(typeof(Workout))] 
    public IHttpActionResult GetWorkout(int id) 
    { 
     Workout workout = db.Workouts.Find(id); 
     if (workout == null) 
     { 
      return NotFound(); 
     } 

     return Ok(workout); 
    } 

Wie werde ich sind dann Sets?

EDIT Und von der Visual Studio Template/Hilfe-Seite, kann ich folgendes sehen:

GET api/Workouts/{id} 

Sollte bieten med mit:

{ 
    "workoutId": 1, 
    "name": "sample string 2", 
    "description": "sample string 3", 
    "sets": [ 
    { 
    "setId": 1, 
    "exercise": { 
    "exerciseId": 1, 
    "name": "sample string 2", 
    "description": "sample string 3", 
    "regionId": 4, 
    "region": { 
    "regionId": 1, 
    "regionName": "sample string 2", 
    "muscles": [ 
     { 
      "muscleId": 1, 
      "latinName": "sample string 2", 
      "dkName": "sample string 3", 
      "enName": "sample string 4", 
      "description": "sample string 5" 
     }, 
     { 
      "muscleId": 1, 
      "latinName": "sample string 2", 
      "dkName": "sample string 3", 
      "enName": "sample string 4", 
      "description": "sample string 5" 
     } 
     ] 
    } 
    }, 

Aber es einfach gewohnt passieren, im offen für alles, was mir ein komplettes Programm in JSON zurückgibt. skype, teamwier, stack, eine andere Lösung, anyhting.

+0

Kennen Sie schon [diese] (https://msdn.microsoft.com/en-us/data/jj574232.aspx#eagerLevels)? – user1429080

+0

Sollten Sie 'SetId' in' WorkOut' nicht haben? – Mairaj

+0

Ich glaube nicht –

Antwort

3

Und schließlich bekam ich es:

public class Exercise 
{ 
    [Key] 
    public int ExerciseId { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 
    //Foreign key for Region 
    //public int RegionId { get; set; } 
    public virtual Region Region { get; set; } //had to be virtual -.- 
} 
+0

Schön, viel Glück mit Ihrer Prüfung :) –

+0

Hey, froh, dass es funktioniert hat. Konnte nicht früher zu dir zurück kommen, verlor Strom und alle Verbindungen für 2 Tage wegen eines Schneestroms. – Sami

2

Wenn Sie die Modelle korrekt eingerichtet haben, sollte die Verkettung der Methoden funktionieren.

public IQueryable<Workout> GetWorkouts() 
{   
    return db.Workouts.Include(w => w.Sets.AsQueryable().Include(s => s.Excercises.AsQueryable().Include(e => e.Regions.AsQueryable().Include(r => r.Muscles)))); 
} 
+0

Nein, im Code (s => s.Übung) ist das s ein Training, kein a Set, weil die Sets eine Sammlung ist, aber jeder Satz hat 1 Übung. also muss ich da eine foreach hineinwerfen oder? –

+0

Können Sie ein kurzes Beispiel für die Sammlung erstellen, die die Abfrage voraussichtlich zurückgeben soll? Ich habe die Struktur ein wenig missverstanden. – Sami

+0

Ich habe versucht, hoffe es macht es klar –