Query不返回子集合

entity-framework entity-framework-core linq

我仍然在為此努力,為什麼每個'Category'項都返回null'Task'集合。我在數據庫中有數據,我缺少什麼?

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

一般承認的答案

您的查詢屬於Ignored Includes案例:

如果更改查詢以使其不再返回查詢開頭的實體類型的實例,則忽略包含運算符。

如鍊接中所述,如果將以下內容添加到DbContext OnConfiguring

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

然後代替null集合,你會在錯誤消息中得到包含類似內容的InvalidOperationException

導航的Include操作:'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();    
}

熱門答案

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


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow