Aracılığıyla paylaş


Ham SQL Sorguları (EF6)

Entity Framework, varlık sınıflarınızla LINQ kullanarak sorgulamanızı sağlar. Ancak, bazen doğrudan veritabanında ham SQL kullanarak sorgu çalıştırmak isteyebilirsiniz. Bu, şu anda saklı yordamlara eşlemeyi desteklemeyen Code First modelleri için yararlı olabilecek saklı yordamları çağırmayı içerir. Bu konu başlığında gösterilen teknikler, gerek Code First gerekse EF Designer ile oluşturulan modellere için geçerlidir.

Varlıklar için SQL sorguları yazma

DbSet'te SqlQuery yöntemi, varlık örneklerini döndürecek bir ham SQL sorgusunun yazılmasına olanak tanır. Döndürülen nesneler bağlam tarafından aynı linq sorgusu tarafından döndürülürken olduğu gibi izlenir. Örnek:

using (var context = new BloggingContext())
{
    var blogs = context.Blogs.SqlQuery("SELECT * FROM dbo.Blogs").ToList();
}

LINQ sorgularında olduğu gibi, sonuçlar numaralandırılana kadar sorgunun yürütülmediğini unutmayın; yukarıdaki örnekte bu, ToList çağrısıyla gerçekleştirilir.

Ham SQL sorguları iki nedenden dolayı yazıldığında dikkatli olunmalıdır. İlk olarak, sorgunun yalnızca istenen türdeki varlıkları döndürdüğünden emin olmak için yazılması gerekir. Örneğin, devralma gibi özellikleri kullanırken, yanlış CLR türünde varlıklar oluşturacak bir sorgu yazmak kolaydır.

İkincisi, bazı ham SQL sorgusu türleri, özellikle SQL ekleme saldırılarına yönelik olası güvenlik risklerini ortaya çıkarır. Bu tür saldırılara karşı korunmak için sorgunuzda parametreleri doğru şekilde kullandığınızdan emin olun.

Saklı yordamlardan varlıkları yükleme

Saklı yordamın sonuçlarından varlıkları yüklemek için DbSet.SqlQuery kullanabilirsiniz. Örneğin, aşağıdaki kod dbo'ya çağrı yapar. Veritabanında GetBlogs yordamı:

using (var context = new BloggingContext())
{
    var blogs = context.Blogs.SqlQuery("dbo.GetBlogs").ToList();
}

Aşağıdaki söz dizimini kullanarak parametreleri saklı yordama da geçirebilirsiniz:

using (var context = new BloggingContext())
{
    var blogId = 1;

    var blogs = context.Blogs.SqlQuery("dbo.GetBlogById @p0", blogId).Single();
}

Varlık olmayan türler için SQL sorguları yazma

Temel türler de dahil olmak üzere herhangi bir türün örneklerini döndüren bir SQL sorgusu, Database sınıfındaki SqlQuery yöntemi kullanılarak oluşturulabilir. Örnek:

using (var context = new BloggingContext())
{
    var blogNames = context.Database.SqlQuery<string>(
                       "SELECT Name FROM dbo.Blogs").ToList();
}

Veritabanındaki SqlQuery'den döndürülen sonuçlar, nesneler bir varlık türünün örnekleri olsa bile bağlam tarafından hiçbir zaman izlenmez.

Veritabanına ham komutlar gönderme

Sorgu olmayan komutlar, Veritabanı'nda ExecuteSqlCommand yöntemi kullanılarak veritabanına gönderilebilir. Örnek:

using (var context = new BloggingContext())
{
    context.Database.ExecuteSqlCommand(
        "UPDATE dbo.Blogs SET Name = 'Another Name' WHERE BlogId = 1");
}

ExecuteSqlCommand kullanılarak veritabanındaki verilerde yapılan tüm değişikliklerin, varlıklar veritabanından yüklenene veya yeniden yüklenene kadar bağlamın opak olduğunu unutmayın.

Çıktı Parametreleri

Çıkış parametreleri kullanılırsa, sonuçlar tamamen okunana kadar değerleri kullanılamaz. Bunun nedeni DbDataReader'ın temel davranışıdır. Daha fazla ayrıntı için bkz . DataReader Kullanarak Veri Alma.