2016-08-08 14 views
0

Ich habe immer noch damit zu kämpfen, warum jedes 'Category' Elemente null 'Task' Sammlungen zurückgibt. Ich habe Daten in der Datenbank, was fehlt mir?Abfrage gibt untergeordnete Auflistungen keine zurück

public class ApplicationUser : IdentityUser 
{ 
    public ICollection<Category> Categories { get; set; } 
} 

public class Category 
{ 
    public int CategoryId { get; set; } 
    public string Name { get; set; } 
    public DateTime Timestamp { get; set; } 

    public ICollection<Task> Tasks { get; set; } 
} 

public class Task 
{ 
    public int TaskId { get; set; } 
    public string Name { get; set; } 
    public DateTime Timestamp { get; set; } 
} 

Und hier ist die Abfrage:

public IEnumerable<Category> GetAllForUser(string name) 
{ 
    return _ctx.Users.Where(x => x.UserName == name) 
        .SelectMany(x => x.Categories) 
        .Include(x => x.Tasks).ToList();  
} 

Antwort

3

Ihre Anfrage in Ignored Includes Fall fällt:

Wenn Sie die Abfrage so ändern, dass sie keine Instanzen des Entitätstyps zurückgibt, mit dem die Abfrage gestartet wurde, werden die include-Operatoren ignoriert.

Wie in den Link, wenn Sie das folgende zu Ihrem DbContext hinzufügen OnConfiguring:

optionsBuilder.ConfigureWarnings(warnings => warnings.Throw(CoreEventId.IncludeIgnoredWarning)); 

dann statt null Sammlung Sie InvalidOperationException enthält so etwas wie dies in der Fehlermeldung bekommen:

Der Include-Vorgang für die Navigation: 'x.Tasks' wurde ignoriert, da die Zielnavigation in den endgültigen Abfrageergebnissen nicht erreichbar ist.

Also, wie das zu beheben? Anscheinend besteht die Anforderung darin, die Abfrage von der Entität zu starten, für die Sie Includes hinzufügen möchten. In Ihrem Fall sollten Sie von _ctx.Categories starten. Aber um den gleichen Filter anzuwenden, müssen Sie die Reverse-Navigationseigenschaft des Application.Users zum Category Klasse hinzuzufügen:

public class Category 
{ 
    // ... 
    public ApplicationUser ApplicationUser { get; set; } 
} 

Jetzt werden folgende Arbeiten:

public IEnumerable<Category> GetAllForUser(string name) 
{ 
    return _ctx.Categories 
     .Where(c => c.ApplicationUser.UserName == name) 
     .Include(c => c.Tasks) 
     .ToList();  
} 
+0

Dies ist perfekt Ivan, großartige Erklärung, ich habe gegen das, was Sie oben erwähnt haben, getestet, um es vollständig zu verstehen, und Sie haben die Lösung genagelt. ich schätze es – lucas

0

Try this:

public IEnumerable<Category> GetAllForUser(string name) 
{ 
    return _ctx.Users 
       .Include(u => u.Categories) 
       .Include(u => u.Categories.Select(c => c.Tasks)) 
       .Where(x => x.UserName == name) 
       .SelectMany(x => x.Categories) 
       .ToList();  
} 
0
public virtual ICollection<Task> Tasks { get; set; } 
+0

Bitte mehr Informationen bearbeiten. Code-only und "try this" Antworten werden abgeraten, da sie keine durchsuchbaren Inhalte enthalten und nicht erklären, warum jemand "das versuchen sollte". Wir bemühen uns, eine Ressource für Wissen zu sein. –

Verwandte Themen