2016-06-27 5 views
13

クエリを実行するときに含める3つのモデルがあります。Entity FrameworkコアEager読み込み後にコレクションに含める

ここにシナリオがあります。

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

答えて

19

SaleNotesがコレクションナビゲーションプロパティであることは重要ではありません。これは、参照とコレクションのために同じように機能する必要があります、最新の参考のため

_dbContext.Sale.Include(s => s.SaleNotes.Select(sn=>sn.User)); 
+13

ありがとうございます。私は実際に、ユーザーがIntellisenseで表示されていないにもかかわらず、私はsn.Userを追加し、私のソリューションを構築し、それが走ったことがわかりました!インテリセンスはラムダ式のSaleNotes "sn"をコレクションとして扱っていたので、Userクラスの個々のプロパティは表示されませんでした。 –

+0

ようこそ。私は助けることができてうれしい;) – octavioccl

+3

@AllenRufolo 2つのオーバーロードがあります.1つは全体リスト(最初のものとデフォルトのもの)、もう1つはリストの各項目(2番目のもの)を与えるものです。あなたは単にインテリセンスで "下向きの矢印"を行うと、予想されるインテリセンスオプションが表示されます。私は自分自身も同じ混乱を覚えました:-) – gzak

2

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

しかし、これまで私が知っている、EF7も古いマルチレベル選択拡張メソッドを使用して構文を含めサポートしています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(); 
} 
関連する問題