2016-08-08 72 views
0

我仍然與此鬥爭,爲什麼每個'類別'項目返回空'任務'集合。我確實有數據庫中的數據,我錯過了什麼?查詢不返回子集合

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; } 
} 

這裏是查詢:

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

回答

3

您的查詢落入Ignored Includes情況:

如果更改查詢以使其不再返回查詢開始的實體類型的實例,則包含操作符將被忽略。

如鏈接解釋,如果你添加以下到您的DbContext OnConfiguring

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

然後代替null收集你會得到InvalidOperationException包含錯誤信息裏面是這樣的:

導航的包含操作:'x.Tasks'被忽略,因爲目標導航在最終查詢結果中無法訪問。

那麼如何解決?顯然,要求是從要添加的實體開始查詢。在你的情況下,你應該從_ctx.Categories開始。但爲了應用相同的過濾器,你需要將Application.Users的反向導航屬性添加到Category類:

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

現在下面的工作:

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

這是完美的伊萬,很好的解釋,我已經針對上面提到的完全理解它進行了測試,並且您已經確定瞭解決方案。我很感激 – lucas

0

試試這個:

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

請更多信息編輯。僅限代碼和「嘗試這個」的答案是不鼓勵的,因爲它們不包含可搜索的內容,也不解釋爲什麼有人應該「嘗試這個」。我們在這裏努力成爲知識的資源。 –