Entity Framework Tips & Tricks
AsNoTracking Kullanımı
Entity Framework ile datalara erişilir ve sonrasında SaveChanges() methodu ile erişilen entityler üzerinde işlem yapılabilir.(Örneğin; update,delete,add). EF’in bunu yapabilmesinin nedeni, getirdiğimiz varlıkların DbContext tarafından izlenmesi ve önbelleğe alınmasıdır. Çekilen veriler SaveChanges methodu çağırılana kadar ki süreçte takip edilmekte, depolanmaktadır. Okuma işlemi yapılan veriler üzerinde herhangi silme,ekleme ve güncellenme işlemi yapılamayacaksa oluşturulan linqya AsNoTracking() eklenerek takip kaldırılabilir. Bu şekilde performansa fayda sağlanmış olacaktır.
this.context.Entities.AsNoTracking()
.Where(x => x.CutomerId == customerId);
Select Kullanımı
Entitynin yalnızca bir propertysine ihtiyaç duyuluyorsa , tüm propertylerin verilerini çekmek yerilene select() ile yalnızca ihtiyaç duyulan alan çağırılabilmektedir.
this.context.Entities.Select(e => e.Amount).ToList();Skip Take ile Sayfalama
Bir sayfada dataların belli bir kısmı gösterilecekse tüm datayı çekmek gereksiz olacaktır. Sayfalama işlemleri için skip() take() methodları kullanılabilir. Skip methodu ile istenilen kayıt sayılısı atlanır ve take methodu ile kaç tane kayıt çekileceği belirlenir. Örneğin ilk 5 kayıt sonrasındaki 3 kayıt çekilmektedir.
var data = this.context.Customers.AsNoTracking().Skip(5).Take(3).ToList();Get buket pehlivan’s stories in your inbox
Join Medium for free to get updates from this writer.
SaveChanges Kullanımı
SaveChanges() metodu çağırılana kadar entitylerde yapılan tüm değişiklikler izlenmeye devam etmektedir. SaveChanges ile tüm değişiklikler kalıcı hale getirilmektedir. Yani database ile iletişim kurulmaktadır. Birbirini etkilemeyen işlemlerde ihtiyaç olmaması halinde her add , update , remove işleminden sonra SaveChanges metodu çağrılmamalı, tüm işlemler bittikten sonra çalıştırılmalıdır. Böylece performansa etki etmektedir.
Async QueryableExtensions Kullanımı
Asenkron kod kullanmak, uygulamalarımızın performansını arttırabilmektedir. Senkron queryableextensionsların asenkron karşılıkları kullanılabilmektedir.
async Task<Entity> Update(IEntityUpdate updateModel)
{
var dbModel = await this.context.Entities
.FirstOrDefaultAsync(e => e.CustomerId = updateModel.CustomerId);
dbModel.Prop1 = updateModel.Prop1;
dbModel.Prop2 = updateModel.Prop2;
await this.context.SaveChangesAsync();
}Contains Kullanımı
Gerek olmadıkça contains kullanımından kaçınılmalıdır. Contains sqldeki in() fonksiyonuna karşılık gelmektedir. Tüm datalar check edildikten sonra sonuç döner ve performansı olumsuz etkileyebilir.
Karmaşık Queryler
LINQ kullanılarak kolayca ifade edilemeyen karmaşık sorguların yürütülmesi gereken durumlar olabilir. Bu tür durumlarda, EF içinde parametreli SQL sorgularını doğrudan yürütmek için FromSqlRaw() veya ExecuteSqlCommand() yöntemlerini kullanılabilir. Bu şekilde performans sql queryleri ile yönetilebilir.






