İlgili Verilerin Hevesle Yüklenmesi

İstekli yükleme

sorgu sonuçlarına Include eklenecek ilgili verileri belirtmek için yöntemini kullanabilirsiniz. Aşağıdaki örnekte, sonuçlarda döndürülen bloglar, Posts özelliği ilgili gönderilerle doldurulmuş olarak geri dönecektir.

using (var context = new BloggingContext())
{
    var blogs = await context.Blogs
        .Include(blog => blog.Posts)
        .ToListAsync();
}

Tavsiye

Entity Framework Core, daha önce bağlam örneğine yüklenmiş olan diğer varlıklara gezinti özelliklerini otomatik olarak düzeltir. Bu nedenle, bir gezinti özelliğinin verilerini açıkça dahil etmeseniz bile, ilgili varlıkların bir kısmı veya tümü daha önce yüklenmişse özellik yine de doldurulabilir.

Birden çok ilişkideki ilgili verileri tek bir sorguya ekleyebilirsiniz.

using (var context = new BloggingContext())
{
    var blogs = await context.Blogs
        .Include(blog => blog.Posts)
        .Include(blog => blog.Owner)
        .ToListAsync();
}

Dikkat

Tek bir sorguda koleksiyon gezintisi yüklemek, performans sorunlarına neden olabilir. Daha fazla bilgi için bkz . Tek ve bölünmüş sorgular.

Birden çok düzey dahil etmek

ThenInclude yöntemini kullanarak ilişkilerde derinlemesine inceleme yapabilir ve birden çok düzeyde ilişkili veri ekleyebilirsiniz. Aşağıdaki örnek tüm blogları, ilgili gönderilerini ve her gönderinin yazarını yükler.

using (var context = new BloggingContext())
{
    var blogs = await context.Blogs
        .Include(blog => blog.Posts)
        .ThenInclude(post => post.Author)
        .ToListAsync();
}

Daha fazla ilişkili veri seviyelerini dahil etmeye devam etmek için ThenInclude üzerinden birden çok çağrıyı zincirleyebilirsiniz.

using (var context = new BloggingContext())
{
    var blogs = await context.Blogs
        .Include(blog => blog.Posts)
        .ThenInclude(post => post.Author)
        .ThenInclude(author => author.Photo)
        .ToListAsync();
}

Birden çok düzeyden ve birden çok kökten gelen ilgili verileri aynı sorguya eklemek için tüm çağrıları birleştirebilirsiniz.

using (var context = new BloggingContext())
{
    var blogs = await context.Blogs
        .Include(blog => blog.Posts)
        .ThenInclude(post => post.Author)
        .ThenInclude(author => author.Photo)
        .Include(blog => blog.Owner)
        .ThenInclude(owner => owner.Photo)
        .ToListAsync();
}

Dahil edilen varlıklardan biri için birden çok ilgili varlık eklemek isteyebilirsiniz. Örneğin, Blogs sorgularken Posts öğesini ve sonra Posts öğesinin hem Author hem de Tags öğelerini dahil etmek istersiniz. Her ikisini de eklemek için kökte başlayan her ekleme yolunu belirtmeniz gerekir. Örneğin, Blog -> Posts -> Author ve Blog -> Posts -> Tags. Bu, gereksiz birleşimler elde edeceğiniz anlamına gelmez; çoğu durumda EF, SQL oluştururken birleşimleri bir araya getirir.

using (var context = new BloggingContext())
{
    var blogs = await context.Blogs
        .Include(blog => blog.Posts)
        .ThenInclude(post => post.Author)
        .Include(blog => blog.Posts)
        .ThenInclude(post => post.Tags)
        .ToListAsync();
}

Tavsiye

Tek bir Include yöntem kullanarak birden çok gezintiyi de yükleyebilirsiniz. Bu, tamamı referanslardan oluşan veya tek bir koleksiyonla biten gezinti "zincirleri" için mümkündür.

using (var context = new BloggingContext())
{
    var blogs = await context.Blogs
        .Include(blog => blog.Owner.AuthoredPosts)
        .ThenInclude(post => post.Blog.Owner.Photo)
        .ToListAsync();
}

Filtrelenmiş dahil etme

İlgili verileri yüklemek için Dahil Et'i uygularken, eklenen koleksiyon gezintisine belirli numaralandırılabilir işlemler ekleyebilirsiniz. Bu işlem sonuçları filtrelemeye ve sıralamaya olanak tanır.

Desteklenen işlemler şunlardır: Where, OrderBy, OrderByDescending, ThenBy, ThenByDescending, , Skipve Take.

Bu tür işlemler, aşağıda gösterildiği gibi Include yöntemine geçirilen lambda koleksiyon gezintisine uygulanmalıdır:

using (var context = new BloggingContext())
{
    var filteredBlogs = await context.Blogs
        .Include(
            blog => blog.Posts
                .Where(post => post.BlogId == 1)
                .OrderByDescending(post => post.Title)
                .Take(5))
        .ToListAsync();
}

Eklenen her gezinti yalnızca bir benzersiz filtre işlemi kümesine izin verir. Belirli bir koleksiyon gezintisi için birden çok Include işleminin uygulandığı durumlarda (blog.Posts aşağıdaki örneklerde), filtre işlemleri yalnızca bunlardan birinde belirtilebilir:

using (var context = new BloggingContext())
{
    var filteredBlogs = await context.Blogs
        .Include(blog => blog.Posts.Where(post => post.BlogId == 1))
        .ThenInclude(post => post.Author)
        .Include(blog => blog.Posts)
        .ThenInclude(post => post.Tags.OrderBy(postTag => postTag.TagId).Skip(3))
        .ToListAsync();
}

Alternatif olarak, birden çok kez dahil edilen her gezinti için aynı işlemler uygulanabilir:

using (var context = new BloggingContext())
{
    var filteredBlogs = await context.Blogs
        .Include(blog => blog.Posts.Where(post => post.BlogId == 1))
        .ThenInclude(post => post.Author)
        .Include(blog => blog.Posts.Where(post => post.BlogId == 1))
        .ThenInclude(post => post.Tags.OrderBy(postTag => postTag.TagId).Skip(3))
        .ToListAsync();
}

Dikkat

İzleme sorgularında, gezinti düzeltmesi nedeniyle Filtrelenmiş Dahil Et sonuçları beklenmedik olabilir. Daha önce sorgulanmış ve Değişiklik İzleyicisi'nde depolanmış olan tüm ilgili varlıklar, filtrenin gereksinimlerini karşılamasalar bile Filtrelenmiş Dahil Et sorgusunun sonuçlarında bulunur. Bu durumlarda, Filtrelenmiş Dahil Etme kullanırken NoTracking sorgularını kullanmayı veya DbContext'i yeniden oluşturmayı düşünebilirsiniz.

Örnek:

var orders = await context.Orders.Where(o => o.Id > 1000).ToListAsync();

// customer entities will have references to all orders where Id > 1000, rather than > 5000
var filtered = await context.Customers.Include(c => c.Orders.Where(o => o.Id > 5000)).ToListAsync();

Uyarı

Sorguların takip edilmesi durumunda, filtreli eklemenin uygulandığı gezinme yüklendiyse kabul edilir. Bu, bazı öğeler eksik olsa bile EF Core'un açık yükleme veya gecikmeli yükleme kullanarak değerlerini yeniden yüklemeye çalışmayacağı anlamına gelir.

Türetilmiş türlere ekle

Kullanabilirsiniz Include ve ThenInclude yalnızca türetilmiş bir türe tanımlı gezinti üzerinden ilgili verileri ekleyebilirsiniz.

Aşağıdaki model göz önünde bulundurulduğunda:

public class SchoolContext : DbContext
{
    public DbSet<Person> People { get; set; }
    public DbSet<School> Schools { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<School>().HasMany(s => s.Students).WithOne(s => s.School);
    }
}

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class Student : Person
{
    public School School { get; set; }
}

public class School
{
    public int Id { get; set; }
    public string Name { get; set; }

    public List<Student> Students { get; set; }
}

School Öğrenci olan tüm Kişilerin gezinti içeriği birçok desen kullanılarak hevesle yüklenebilir:

  • Dönüşümü kullanma

    context.People.Include(person => ((Student)person).School).ToList()
    
  • İşleci as kullanma

    context.People.Include(person => (person as Student).School).ToList()
    
  • Include için string türünde parametre alan aşırı yükleme kullanma

    context.People.Include("School").ToList()
    

Otomatik dahil edilen gezintiler için model yapılandırması

Modelde, varlığın veritabanından her yüklendiğinde dahil edilmesi için bir gezinti, AutoInclude yöntemini kullanarak yapılandırabilirsiniz. Herhangi bir sorguda, sonuçlarda varlık türü döndürüldüğünde Include ile gezinmeyi belirtmekle aynı etkiye sahiptir. Aşağıdaki örnekte bir gezintinin otomatik olarak dahil edilecek şekilde nasıl yapılandırılacağı gösterilmektedir.

modelBuilder.Entity<Theme>().Navigation(e => e.ColorScheme).AutoInclude();

Yukarıdaki yapılandırmanın ardından, aşağıdaki gibi bir sorgu çalıştırarak sonuçlardaki tüm temalar için ColorScheme gezinti yüklenir.

using (var context = new BloggingContext())
{
    var themes = await context.Themes.ToListAsync();
}

Bu yapılandırma, sonuçlarda nasıl görünürse görünsün sonuçta döndürülen her varlığa uygulanır. Başka bir deyişle, bir varlık, bir gezintinin kullanımı, başka bir varlık türü veya otomatik ekleme yapılandırması nedeniyle sonuçta yer alıyorsa, otomatik eklenen tüm gezintiler onun için yüklenecektir. Aynı kural, varlığın türetilmiş türüne otomatik olarak eklenmiş olarak yapılandırılan gezintilere de genişletilir.

Belirli bir sorgu için, model düzeyinde otomatik olarak dahil edilecek şekilde yapılandırılmış bir gezinti aracılığıyla ilgili verileri yüklemek istemiyorsanız, sorgunuzda yöntemini kullanabilirsiniz IgnoreAutoIncludes . Bu yöntemin kullanılması, kullanıcı tarafından otomatik ekleme olarak yapılandırılan tüm gezintilerin yüklenmesini durdurur. Aşağıdaki gibi bir sorgu çalıştırıldığında veritabanındaki tüm temalar getirilir, ancak ColorScheme otomatik olarak eklenmiş navigasyon olarak yapılandırılmış olsa bile yüklenmez.

using (var context = new BloggingContext())
{
    var themes = await context.Themes.IgnoreAutoIncludes().ToListAsync();
}

Uyarı

Sahip olunan türlere yönelik gezintiler de kural gereği otomatik olarak dahil edilir ve IgnoreAutoIncludes API kullanılması bunların dahil edilmesini engellemez. Bunlar sorgu sonuçlarına dahil edilmeye devam eder.