Merhaba arkadaşlar, bu yazımda sizlere Linq Include Kullanımı konusundan bahsedeceğim.
Entity Framework kullanırken Eager Loading ve Lazy Loading kavramlarını çoğunlukla duymuşuzdur. Bu kavramları açıklamak istiyorum.
Lazy Loading: Oluşturduğumuz entity modeller için varsayılan data yükleme yöntemidir. Örnek vermek gerekirse Product ve ProductDetail adında iki tane entity modelimiz var. Biz Product için bir sorgu attığımızda ilgili ProductDetail nesnesini de kullanmaya çalıştığımızda bu nesneyi dolduracaktır ve yüklemiş olacaktır. Özet olarak otomatik olarak bir yükleme söz konusudur.
Eager Loading: Veri tabanından veri çekme işlemi yapılırken Eager Loading özelliğini kullanmak istiyorsak öncelikle Lazy Loading özelliğini pasif hale getirmemiz gerekmektedir.
context.Configuration.LazyLoadingEnabled = false;
LazyLoading pasif hale getirildikten sonra da sorgularımızı yazarken ilişkili olan nesneleri sorgumuza dahil ediyoruz. Aslında sorgu sırasında entity’leri daha sorgumuzu yazarken birbirine bağlayıp tek seferde bir çekme işlemi sağlamış oluyoruz.
Bu işlemi sağlarken de Include metodunu kullanarak entity’leri birbirine bağlama işlemini gerçekleştirmiş oluyoruz.
Hemen bir örnek üzerinden Include işlemini sağlamak istiyorum.
Öncelikle 2 adet model yani Product ve Category entity modelimizi oluşturuyoruz.
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
public DateTime CreateDate { get; set; }
public virtual Category Category { get; set; }
}
public class Category
{
public Category()
{
Products = new HashSet<Product>();
}
public int Id { get; set; }
public string Name { get; set; }
public DateTime CreateDate { get; set; }
public virtual ICollection<Product> Products { get; set; }
}
Product ve Category nesnelerimizi oluşturduk. İlişkili olacakları için Product üzerinde bir Category nesnesi, Category üzerinde de Product Listesi bulunmakta.
Şimdi ürün listemizi çekmek için sorgumuzu yazalım.
using (var context = new DemoDBContext())
{
context.Configuration.LazyLoadingEnabled = false;
var products = context.Products.Include("Category").ToList();
foreach (var product in products)
{
Console.WriteLine(product.Name);
}
}
Görüldüğü üzere öncelikle LazyLoadingEnabled özelliğini false olarak işaretledik. LazyLoadingEnabled özelliğini oluşturduğumuz context dosyasının içerisinde yazmamız daha iyi olacaktır. Gösterimi sağlamak için bu işlemi burada gerçekleştirdim. LazyLoadingEnabled özelliğini pasif ettiğimizde Product nesnemizde Category nesnemiz null olarak gözükecektir. Include metodunu kullanarak sorgumuzu çektiğimizde ise bu nesneyi dolduracaktır ve Category bilgisini de kullanmak istersek bu şekilde kullanabiliriz. Product nesnesi içerisinde Category nesnemizin adı ne ise Include metodunun içerisinde de onu belirtmemiz gerekiyor.
Umarım faydalı olur 🙂
Bir sonraki yazıda görüşmek üzere…