web-dev-qa-db-ja.com

Entity Framework Core Eager Loading Thenコレクションに含める

クエリを実行するときに含める3つのモデルがあります。

これがシナリオです。

public class Sale
{
     public int Id { get; set; }
     public List<SaleNote> SaleNotes { get; set; }
}

public class SaleNote
{
    public int Id { get; set; }
    public User User { get; set; }
}

public class User 
{
    public int Id { get; set; }
}

このようにSaleNotesを熱心に読み込むことができます...

_dbContext.Sale.Include(s => s.SaleNotes);

ただし、ThenIncludeを使用してSaleNoteからUserモデルを積極的にロードしようとするのは、コレクションであるため困難です。このシナリオを熱心にロードする方法の例は見つかりません。誰かが次のThenIncludeに含まれるコードを提供して、コレクション内の各アイテムのユーザーをロードできますか。

_dbContext.Sale.Include(s => s.SaleNotes).ThenInclude(...);
24
Allen Rufolo

SaleNotesがコレクションナビゲーションプロパティであることは関係ありません。参照とコレクションに対して同じように動作するはずです:

_dbContext.Sale.Include(s => s.SaleNotes).ThenInclude(sn=>sn.User);

しかし、私が知る限り、EF7はSelect拡張メソッドを使用した古いマルチレベルのインクルード構文もサポートしています。

_dbContext.Sale.Include(s => s.SaleNotes.Select(sn=>sn.User));
40
octavioccl

参考のため、EF Core(1.1.0)の最新リリースでは、このシナリオの明示的な読み込みもサポートしています。このようなもの...

using (var _dbContext = new DbContext())
{
    var sale = _dbContext.Sale
        .Single(s => s.Id == 1);

    _dbContext.Entry(sale)
        .Collection(n => n.SalesNotes)
        .Load();

    _dbContext.Entry(sale)
        .Reference(u => u.User)
        .Load();
}
5
Bandito