Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Genel bir kural olarak, Entity Framework Core sunucuda bir sorguyu mümkün olduğunca değerlendirmeye çalışır. EF Core, sorgunun bölümlerini istemci tarafında değerlendirebileceği parametrelere dönüştürür. Sorgunun geri kalanı (oluşturulan parametrelerle birlikte), sunucuda değerlendirilecek eşdeğer veritabanı sorgusunu belirlemek için veritabanı sağlayıcısına verilir. EF Core, en üst düzey projeksiyonda kısmi istemci değerlendirmesini destekler (temelde son çağrısı Select()). Sorgudaki en üst düzey projeksiyon sunucuya çevrilemezse EF Core gerekli verileri sunucudan getirir ve istemcide sorgunun kalan bölümlerini değerlendirir. EF Core, üst düzey projeksiyonun dışında, sunucuya çevrilemeyen bir ifadeyi herhangi bir yerde algılarsa, çalışma zamanı istisnası oluşturur. Ef Core'un sunucuya çevrilemez olanları nasıl belirlediğini anlamak için bkz. Sorgular nasıl çalışır ?
Uyarı
3.0 sürümünden önce, Entity Framework Core sorgunun herhangi bir yerinde istemci değerlendirmesini destekliyor. Daha fazla bilgi için önceki sürümler bölümüne bakın.
Tavsiye
Bu makalenin örneğini GitHub'da görüntüleyebilirsiniz.
Üst düzey planlamada müşteri değerlendirmesi
Aşağıdaki örnekte, SQL Server veritabanından döndürülen blogların URL'lerini standartlaştırmak için bir yardımcı yöntem kullanılır. SQL Server sağlayıcısı bu yöntemin nasıl uygulandığına ilişkin bir içgörüye sahip olmadığından, bunu SQL'e çevirmek mümkün değildir. Sorgunun diğer tüm yönleri veritabanında değerlendirilir, ancak döndürülen URL bu yöntem üzerinden geçirildiğinde işlem istemcide yapılır.
var blogs = await context.Blogs
.OrderByDescending(blog => blog.Rating)
.Select(
blog => new { Id = blog.BlogId, Url = StandardizeUrl(blog.Url) })
.ToListAsync();
public static string StandardizeUrl(string url)
{
url = url.ToLower();
if (!url.StartsWith("http://"))
{
url = string.Concat("http://", url);
}
return url;
}
Desteklenmeyen müşteri değerlendirmesi
İstemci değerlendirmesi yararlı olsa da, bazen düşük performansa neden olabilir. Yardımcı yönteminin artık where filtresinde kullanıldığı aşağıdaki sorguyu göz önünde bulundurun. Filtre veritabanına uygulanamadığından, filtrenin istemciye uygulanabilmesi için tüm verilerin belleğe çekilmesi gerekir. Filtreye ve sunucudaki veri miktarına bağlı olarak istemci değerlendirmesi düşük performansa neden olabilir. Entity Framework Core bu tür istemci değerlendirmelerini engeller ve bir çalışma zamanı istisnası oluşturur.
var blogs = await context.Blogs
.Where(blog => StandardizeUrl(blog.Url).Contains("dotnet"))
.ToListAsync();
Açık istemci değerlendirmesi
Aşağıdaki gibi belirli durumlarda açıkça istemci değerlendirmesine zorlamanız gerekebilir
- Veri miktarı küçüktür, böylece istemcide değerlendirme büyük bir performans cezasına neden olmaz.
- Kullanılan LINQ işlecinin sunucu tarafı çevirisi yok.
Böyle durumlarda, AsEnumerable veya ToList yöntemlerini çağırarak (AsAsyncEnumerable veya ToListAsync zaman uyumsuz işlemler için), istemci değerlendirmesini açıkça kabul edebilirsiniz. Kullanarak AsEnumerable sonuçların akışını yaparsınız, ancak kullanmak ToList da ek bellek alan bir liste oluşturarak arabelleğe alma işlemine neden olur. Ancak birden çok kez numaralandırıyorsanız, veritabanında yalnızca bir sorgu olduğundan sonuçların bir listede depolanması daha fazla yardımcı olur. Belirli bir kullanıma bağlı olarak, hangi yöntemin durum için daha yararlı olduğunu değerlendirmeniz gerekir.
var blogs = context.Blogs
.AsAsyncEnumerable()
.Where(blog => StandardizeUrl(blog.Url).Contains("dotnet"))
.ToListAsync();
Tavsiye
Eğer AsAsyncEnumerable kullanıyorsanız ve sorguyu istemci tarafında daha fazla geliştirmek istiyorsanız, zaman uyumsuz numaralandırılabilir öğeler için işleçleri tanımlayan System.Interactive.Async kitaplığını kullanabilirsiniz. Daha fazla bilgi için bkz. istemci tarafı linq işleçleri.
İstemci değerlendirmesinde olası bellek sızıntısı
Sorgu çevirisi ve derleme pahalı olduğundan EF Core derlenmiş sorgu planını önbelleğe alır. Önbelleğe alınan temsilci, üst düzey projeksiyonun istemci değerlendirmesini yaparken istemci kodunu kullanabilir. EF Core, ağacın istemci tarafından değerlendirilen bölümleri için parametreler oluşturur ve parametre değerlerini değiştirerek sorgu planını yeniden kullanılır. Ancak ifade ağacındaki bazı sabitler parametrelere dönüştürülemez. Önbelleğe alınan temsilci bu tür sabitler içeriyorsa, bunlara başvurulmaya devam ettiğinden bu nesneler çöp olarak toplanamaz. Böyle bir nesne içinde DbContext veya başka hizmetler içeriyorsa, uygulamanın bellek kullanımının zaman içinde artmasına neden olabilir. Bu davranış genellikle bellek sızıntısının bir işaretidir. EF Core, geçerli veritabanı sağlayıcısı kullanılarak eşlenemeyen türde sabitlerle karşılaştığında bir istisna fırlatır. Yaygın nedenler ve çözümleri şunlardır:
- Örnek yöntemi kullanma: İstemci projeksiyonunda örnek yöntemleri kullanılırken, ifade ağacı örneğin sabitini içerir. Yönteminiz örnekten herhangi bir veri kullanmıyorsa, yöntemini statik hale getirebilirsiniz. Yöntem gövdesinde örnek verilerine ihtiyacınız varsa, belirli verileri yönteme parametre olarak geçirin.
-
Yönteme sabit bağımsız değişkenleri geçirme: Bu durum genellikle
thisistemci yöntemine bir bağımsız değişken olarak kullanılarak meydana gelir. bağımsız değişkenini veritabanı sağlayıcısı tarafından eşlenebilen birden çok skaler bağımsız değişkene bölmeyi göz önünde bulundurun. - Diğer sabitler: Başka bir durumda bir sabitle karşılaşırsanız, işlemde sabitin gerekli olup olmadığını değerlendirebilirsiniz. Sabitin olması gerekiyorsa veya yukarıdaki durumlardan bir çözüm kullanamıyorsanız, değeri depolamak ve sorguda yerel değişkeni kullanmak için yerel bir değişken oluşturun. EF Core, yerel değişkeni bir parametreye dönüştürür.
Önceki sürümler
Aşağıdaki bölüm 3.0 öncesi EF Core sürümleri için geçerlidir.
Eski EF Core sürümleri, yalnızca üst düzey projeksiyonu değil, sorgunun herhangi bir bölümünde istemci değerlendirmesini desteklemektedir. Bu nedenle Desteklenmeyen istemci değerlendirme bölümü altında gönderilen sorguya benzer sorgular doğru şekilde çalıştı. Bu davranış farkedilmeden performans sorunlarına neden olabileceğinden EF Core bir istemci değerlendirme uyarısı günlüğe kaydetti. Günlük kaydını görme hakkında daha fazla bilgi için bkz. Günlüğe kaydetme.
EF Core, isteğe bağlı olarak, projeksiyon dışında istemci değerlendirmesi yapıldığında özel durum fırlatma veya hiçbir şey yapmama şeklindeki varsayılan davranışı değiştirmenize izin verir. Özel durum oluşturma davranışı, bunu 3.0'daki davranışa benzer hale getirir. Davranışı değiştirmek için, bağlamınızın seçeneklerini ayarlarken, genellikle DbContext.OnConfiguring içinde veya ASP.NET Core kullanıyorsanız Startup.cs içinde uyarıları yapılandırmanız gerekir.
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder
.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=EFQuerying;Trusted_Connection=True;")
.ConfigureWarnings(warnings => warnings.Throw(RelationalEventId.QueryClientEvaluationWarning));
}