2016-05-07 7 views
1

Ich habe es schwer, dies herauszufinden. In den Beispielen werden keine Async-Aufrufe verwendet.Wie Sie untergeordnete Eigenschaften mit Entity Framework einschließen

Wie verwende ich Include, wenn Sie einen Anruf für ein einzelnes Objekt mit ID erhalten?

Muss ich den asynchronen Anruf loswerden? Ich brauche die passende

ExerciseRepetitions && ExerciseImages 

Auch enthalten, wie konnte ich eine

.Where(k => k.IsHidden != true) 

für jedes Kind-Modell hinzufügen?

[Route("")] 
public IQueryable<Exercise> GetExercises() 
{ 
    var result = db.Exercises 
     .Include(c => c.ExerciseRepetitions) 
     .Include(o => o.ExerciseImages) 
     .Where(k => k.IsHidden != true); 
    return result; 
} 

// GET: api/Exercises/5 
[Route("{id:int}")] 
[ResponseType(typeof(Exercise))] 
public async Task<IHttpActionResult> GetExercise(int id) 
{ 
    Exercise exercise = await db.Exercises.FindAsync(id); 

     ///// I need this call to return ExerciseRepetitions && ExerciseImages as nested arrays. Also I need to filter out any object that has IsHidden = true. 

    if (exercise == null) 
    { 
     return NotFound(); 
    } 

    return Ok(exercise); 
} 
+0

Was genau müssen Sie tun? Es ist nicht klar – CodeNotFound

+0

Lassen Sie mich Frage – texas697

+0

ok aktualisieren, siehe den Kommentar darunter erwarten db.Exercises – texas697

Antwort

2

Sie können Entitäten nicht über die Erweiterungsmethode Include filtern.

Sie können Folgendes tun, indem Sie die Auflistungseigenschaften explizit laden. Durch das explizite Laden können Sie die Sammlung filtern, die Sie so laden:

if(exercise != null) 
{ 
    await db.Entry(exercise) 
      .Collection(p => p.ExerciseRepetitions) 
      .Query() 
      .Where(p => !p.IsHidden) 
      .LoadAsync(); 

    await db.Entry(exercise) 
      .Collection(p => p.ExerciseImages) 
      .Query() 
      .Where(p => !p.IsHidden) 
      .LoadAsync(); 
} 
+0

sieht gut aus, könnten Sie mir zeigen, wie man es einstecken? Muss ich die asynchrone Methode loswerden und etwas anderes verwenden? – texas697

+1

'var Übung = db.Exercises.Find (id); if (übung! = null) {/ * hier kommt das explizite Laden * /} ' – Gabor

+0

Ich habe meine Antwort auf ad @Gabor notiert und benutze LoadAsync async method statt Load. – CodeNotFound

Verwandte Themen