クエリは子コレクションを返しません

entity-framework entity-framework-core linq

質問

私はまだこれと闘っています。それぞれの「カテゴリ」アイテムがヌルの「タスク」コレクションを返すのはなぜですか。私はデータベースにデータを持っていますが、何が欠けていますか?

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

受け入れられた回答

あなたの質問は無視されます。Includesケース:

クエリが開始されたエンティティタイプのインスタンスを返さないようにクエリを変更すると、インクルード演算子は無視されます。

このリンクで説明したように、DbContext OnConfiguring以下を追加した場合:

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

代わりにnullコレクションを使用すると、 InvalidOperationExceptionが次のようなエラーメッセージの中に入ります:

ナビゲーションのための操作を含む: 'x.Tasks'は無視されました。これは、最終的なクエリ結果でターゲットナビゲーションに到達できないためです。

どのようにそれを修正するには?明らかに、追加するエンティティからクエリを開始する必要があります。あなたの場合、 _ctx.Categoriesから始めるべき_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
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ