Condividi tramite


Caricamento esplicito dei dati correlati

Caricamento esplicito

È possibile caricare in modo esplicito una proprietà di navigazione tramite l'API DbContext.Entry(...).

using (var context = new BloggingContext())
{
    var blog = context.Blogs
        .Single(b => b.BlogId == 1);

    context.Entry(blog)
        .Collection(b => b.Posts)
        .Load();

    context.Entry(blog)
        .Reference(b => b.Owner)
        .Load();
}

È anche possibile caricare in modo esplicito una proprietà di navigazione eseguendo una query separata che restituisce le entità correlate. Se il rilevamento delle modifiche è abilitato, quando una query materializza un'entità, EF Core imposta automaticamente le proprietà di navigazione dell'entità appena caricata per fare riferimento a qualsiasi entità già caricata e imposta le proprietà di navigazione delle entità già caricate per fare riferimento all'entità appena caricata.

È anche possibile ottenere una query LINQ che rappresenta il contenuto di una proprietà di navigazione.

In questo modo è possibile applicare altri operatori sulla query. Ad esempio, l'applicazione di un operatore di aggregazione sulle entità correlate senza caricarle in memoria.

using (var context = new BloggingContext())
{
    var blog = context.Blogs
        .Single(b => b.BlogId == 1);

    var postCount = context.Entry(blog)
        .Collection(b => b.Posts)
        .Query()
        .Count();
}

È anche possibile filtrare le entità correlate che vengono caricate in memoria.

using (var context = new BloggingContext())
{
    var blog = context.Blogs
        .Single(b => b.BlogId == 1);

    var goodPosts = context.Entry(blog)
        .Collection(b => b.Posts)
        .Query()
        .Where(p => p.Rating > 3)
        .ToList();
}