Sorgular Nasıl Çalışır?

Entity Framework Core, veritabanındaki verileri sorgulamak için Dil Tümleşik Sorgusu (LINQ) kullanır. LINQ, türetilmiş bağlamınıza ve varlık sınıflarınıza göre kesin olarak yazılan sorgular yazmak için C# (veya tercih ettiğiniz .NET dili) kullanmanıza olanak tanır.

Dekont

Bu makale güncel değil ve sorgu işlem hattının tasarımında gerçekleşen değişiklikleri hesaba eklemek için bazı bölümlerinin güncelleştirilmesi gerekiyor. Burada bahsedilen herhangi bir davranışla ilgili şüpheleriniz varsa lütfen bir soru sorun.

Sorgunun ömrü

Aşağıdaki açıklama, her sorgunun geçtiği işleme üst düzey bir genel bakıştır.

  1. LINQ sorgusu, veritabanı sağlayıcısı tarafından işlenmeye hazır bir gösterim oluşturmak için Entity Framework Core tarafından işlenir
    1. Sonuç önbelleğe alınır, böylece sorgu her yürütülürken bu işlemenin yapılması gerekmez
  2. Sonuç veritabanı sağlayıcısına geçirilir
    1. Veritabanı sağlayıcısı, veritabanında sorgunun hangi bölümlerinin değerlendirilebileceğini tanımlar
    2. Sorgunun bu bölümleri veritabanına özgü sorgu diline (örneğin, ilişkisel veritabanı için SQL) çevrilir
    3. Veritabanına bir sorgu gönderilir ve sonuç kümesi döndürülür (sonuçlar varlık örnekleri değil veritabanındaki değerlerdir)
  3. Sonuç kümesindeki her öğe için
    1. Sorgu bir izleme sorgusuysa EF, verilerin bağlam örneğinin değişiklik izleyicisinde zaten var olan bir varlığı temsil ediyor olup olmadığını denetler
      • Öyleyse, var olan varlık döndürülür
      • Aksi takdirde yeni bir varlık oluşturulur, değişiklik izleme ayarlanır ve yeni varlık döndürülür
    2. Sorgu izleme olmayan bir sorguysa, her zaman yeni bir varlık oluşturulur ve döndürülür

Sorgular yürütülürken

LINQ işleçlerini çağırdığınızda, yalnızca sorgunun bellek içi gösterimini oluşturursunuz. Sorgu yalnızca sonuçlar tüketildiğinde veritabanına gönderilir.

Sorgunun veritabanına gönderilmesine neden olan en yaygın işlemler şunlardır:

  • Döngüde for sonuçları yineleme
  • , , ToArray, SingleCountveya eşdeğer zaman uyumsuz aşırı yüklemeleri gibi ToListbir işleç kullanarak

Uyarı

Kullanıcı girişini her zaman doğrulayın: EF Core, sorgularda parametreleri kullanarak ve değişmez değerlerden kaçarak SQL ekleme saldırılarına karşı koruma sağlar ancak girişleri doğrulamaz. LinQ sorgularında güvenilir olmayan kaynaklardan gelen değerler kullanılmadan, varlık özelliklerine atanmadan veya diğer EF Core API'lerine geçirilmeden önce uygulamanın gereksinimlerine göre uygun doğrulama gerçekleştirilmelidir. Bu, sorguları dinamik olarak oluşturmak için kullanılan tüm kullanıcı girişlerini içerir. LINQ kullanırken bile, ifade oluşturmak için kullanıcı girişini kabul ediyorsanız, yalnızca hedeflenen ifadelerin oluşturulabildiğinden emin olmanız gerekir.