EF Core Include, ThenInclude Nedir ?
Entity Framework Core Include Nedir ?
Include yapısı ilişkisel tablolar arasında bağlantıyı kurmaya yaran ve eager loading operasyonunu yapmamızı sağlayan bir fonksiyondur. Üretilen bir sorguya, diğer ilişkisel tabloların dahil edilmesini sağlar.
Include yapılanmasını incelemek için entitylerimizi oluşturalım.
public class Employee { public int RegionId { get; set; } public string? Name { get; set; } public string? Surname { get; set; } public int Salary { get; set; } public List<Order> Orders { get; set; } public Region Region { get; set; } } public class Region { public int Id { get; set; } public string Name { get; set; } public ICollection<Employee> Employees { get; set; } } public class Order { public int Id { get; set; } public int EmployeeId { get; set; } public DateTime OrderDate { get; set; } public Employee Employee { get; set; } }
Yukarıdaki entitylerimizde Include’u kullanmak için aşağıdaki gibi bir kullanım sağlamalıyız. Burada context’ten Employee leri çekip akabinde ilgili Region ve Orders ları da sorgumuzda birleştirmiş olduk.
var employees = await context.Employees .Include(e => e.Region) .Where(e => e.Orders.Count > 2) .Include(e => e.Orders) .ToListAsync();
Entity Framework Core ThenInclude Nedir ?
Yukarıda yaptığımız örnekte ilişkisel tablolarda bir sorguya diğer ilişkisel tabloyu ve buna ait verileri Include ile dahil ettik. ThenInclude ‘un ise kullanım amacını ve ihtiyacını anlamak için yine entitylerimiz üzerinden farklı bir örnek ile ilerleyelim. Aşağıda data base şemasını gördüğümüz entitylerimiz de biz Orders’ dan Employees’e erişmek, oradan da Regions’a erişmek istediğimiz senaryoyu canlandıralım.
Bu istek doğrultusunda sorgumuzu aşağıdaki şekilde kurgulayabiliriz. Burada Context üzerinden Orders’a gidip, Orders tablosuna Employees tablosunu Include ettikten sonra , Employees tablosuna da Regions tablosunu Include edebiliyoruz. Bu işlemi hatasız yapabilmemizin kritik ve temel sebebi ise aslında ilgili tablolar arasındaki navigation propertylerin tekil olmasıdır.
var orders = await context.Orders .Include(o => o.Employee) .Include(o => o.Employee.Region) .ToListAsync();
Fakat biz burada bu işlemin yukardaki data base şemasına ve entitylerimizdeki navigation propertyleri göz önüne alarak bir Regions -> Employees -> Orders şeklinde bir Include işlemi yapmak istemiş olsaydık, navigation propertyler çoğul olduğu için bu işlemi Include ile yapamayacaktık.
Koleksiyonel navigational property den bu türün ilişkili olduğu başka bir tabloya gitmemiz gerekiyorsa bunu ancak ThenInclude ile yapabiliriz.
var regions = await context.Regions .Include(r => r.Employees) .ThenInclude(e => e.Orders) .ToListAsync();
Yukarıda context üzerinden Regions’ ları çektikten sonra buna Employees ‘ ı Include ettik. Fakat bu aşamadan sonra ilgili navigation property koleksiyonel bir yapı olduğu için Employees’dan Orders’a gidebilmemiz için bunu ancak ThenInclude ile yapabiliriz.