You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Bir sorgu yaptıktan sonra, bağlı tablolar istenildiği zamanda çekilebilir. Bu duruma ayrık sorgulama denir.
Ayrık sorgulama yapılırken, ihtiyaç olduğu yerde, lazım olan tabloların sorgulaması yapılıp, context nesnesi üzerine Load() metoduyla eklenir.
EF bu eklemeyi otomatik olarak algılayıp tabloları bağlar.
// Single Queryvaraddresses= _context.Addresses.Include(k => k.Persons);foreach(var address in addresses){foreach(var person in address.Persons){
liste.Add(person.Name);}}
// Separated Queryvaraddresses= _context.Addresses;foreach(var address in addresses){
_context.Persons.Where(k => k.AddressID == address.ID).Load();foreach(var person in address.Persons){
liste.Add(person.Name);}}
02 - Explicit Loading
Sorgulama esnasında bağlı tabloların çekilmeyip, gerektiği yerde sorgunun tekrar yapılıp bağlı tabloların çekilmesine dayalı sorgulama biçimidir.
Eager Loading'teki ayrık sorgulamaya benzer bir yapıda, db üzerine birden fazla sorgu gönderir. Tek farkı kod yapısındadır.
EF Core 1.1 sürümü ve sonrasında desteklenmektedir.
// Example 1varaddresses= _context.Addresses;foreach(var address in addresses){
_context.Entry(address).Collection(k => k.Persons).Load();foreach(var person in address.Persons){
liste.Add(person.Name);}}
Explicit Loading ile bağlı tablolar sorgulandığında, sadece sorgu sonrasında geri dönen değerler ram üzerinde depolanır ve tüm bağlı tablo verileri depolanmaz.
using(varcontext=new BloggingContext()){varblog= context.Blogs
.Single(b => b.BlogId ==1);varpostCount= context.Entry(blog).Collection(b => b.Posts).Query().Count();// => Bu işlem sonucunda sadece sayısal değer ataması yapılır.}
using(varcontext=new BloggingContext()){varblog= context.Blogs
.Single(b => b.BlogId ==1);vargoodPosts= context.Entry(blog).Collection(b => b.Posts).Query().Where(p => p.Rating >3).ToList();// => Bu işlem sonucunda sadece değeri 3ten büyük // olan değerler çekilip ram üzerine yazılır.}
03 - Lazy Loading
Sorgu ilk yapıldığında, bağlı tablolar çekilmez.
Bağlı tablolara ait property'lere ilk ulaşılmaya çalışıldığı zaman, database sorgusu otomatik olarak gerçekleştirilir ve bağlı tablo bilgileri çekilir.
Bağlı tablolara her ulaşılmaya çalışıldığı ilk sefer, ayrı bir sorgu ile database sorgusu yapılır.
Genel olarak Eager Loading kullanılması daha uygundur. Çünkü tüm işlemlerin bir database sorgusu üzerinde yapılması, ayrı ayrı database'e bağlanılıp sorgu yapılmasından daha performanslıdır. Bu yüzden bağlı tablolarla fazla işlem yapılmasının gerekli olmadığı durumda bu yöntem tercih edilir.
Fakat bazı zamanlarda ayrık sorgulama, tek sorgulamadan daha performanslıdır. Özellikle bağlı tabloların hepsini çekmek yerine bir kısmının çekilmesi durumunda veya bağlı tablolar arasındaki ilişkilerin çok karmaşık olduğu durumda bu yöntemin tercih edilmesi daha uygundur.
Performansın çok kritik olduğu durumlarda bu iki durumda, o anki duruma uygun olarak mix edilir.