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 konuda gösterilen teknikler, Code First ve EF Designer ile oluşturulan modellere eşit şekilde uygulanır.

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. Örneğin:

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 veritabanındaki dbo.GetBlogs yordamını çağırır.

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

Aşağıdaki sözdizimini kullanarak parametreleri saklı yordama da aktarabilirsiniz.

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. Örneğin:

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. Örneğin:

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 değişikliklerin, varlıklar veritabanından yüklenene veya yeniden yüklenene kadar bağlam tarafından görülmediğini unutmayın.

Çıkış Parametreleri

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