Skip to main content

LINQ to SQL’de Insert, Update ve Delete İşlemleri

LINQ to SQL ile Insert,Update,Delete İşlemleriBildiğiniz
gibi LINQ adını verdiğimiz dile entegre sorgularla artık .NET ortamında
koleksiyon tabanlı nesneleri sorgulayabiliyoruz. Buradaki
sorgulamaların temel amacı normalde foreach döngüleri, if-else kontrol
yapılarıyla yapabildiğimiz uzun ve karmaşık işlemleri tıpkı T-SQL'de
olduğu gibi sade Select sorguları yazarak daha basit hale getirmektir.
LINQ'in asıl çıkış noktası ise uygulama içerisinde büyük ve karmaşık
olan veri nesnelerini (entity nesnelerini) kolay ve pratik şekilde
sorgulanabilmesini sağlamak ve büyük çaplı projelerde yazılımcıların en
büyük yüklerinden birisini hafifletmektir.

LINQ to SQL ile ilgili olarak en çok sorulan sorulardan birisi de Insert, Update ve Delete
işlemlerinin nasıl gerçekleştirilebileceği. LINQ ifadelerinde Insert,
Update ve Delete gibi anahtar kelimelerle sorgular yazılamadığını
söylemeye gerek yok sanırım:) Dolayısıyla LINQ to SQL'de amaç veri
nesneleriyle çalışmak ise bir şekilde bu tip işlemleri de
gerçekleştirebilmek gerekecektir. LINQ to SQL Classes (.dbml) dosyaları veritabanında yer alan veri nesnelerini doğrudan uygulamamıza class'lar olarak aktarmamızı sağlamaktadır. Örneğin Northwind veritabanındaki Product tablosunu uygulamamızda veri class'ı olarak oluşturduğumuzda DataContext nesnesinin içerisindeki Products
özelliği(property) Products tablosundaki ürünleri koleksiyon olarak
döndürecektir. İşte bu property'nin bazı metotları bizim Insert, Update
ve Delete gibi işlemleri gerçekleştirebilmemizi sağlayacaktır. Bu
metotlardan;

InsertOnSubmit, Insert işlemini
DeleteOnSubmit, Delete işlemini

gerçekleştirebilmektedir.
Peki Update işlemi nerede? Update işlemini ise LINQ sorgusu sonucundan
gelen kayıt veya kayıtların değerlerini değiştirerek
gerçekleştirebileceğiz. Buradaki her üç işleminde sonuçlarının
veritabanına aktarılabilmesi için DataContext nesnesinin SubmitChanges
isimli metodunun çalıştırılması yeterli olacaktır. Aşağıdaki kod
parçalarında LINQ to SQL'de veri ekleme, silme ve güncelleme
işlemlerinin nasıl yapılabileceği görülmektedir. Kodlarda yer alan northWind adındaki nesne DataContext nesnemizdir.

Product eklenecekUrun = new Product() { ProductName = "Acer Aspire 5100", UnitPrice = 1290, UnitsInStock = 15, CategoryID = 9 };

northWind.Products.InsertOnSubmit(eklenecekUrun); // Eklenecekler listesine yeni bir ürün eklendi

 

Product guncellenecekUrun = northWind.Products.First(u => u.ProductID == 69);

guncellenecekUrun.ProductName = "HP Pavilion 3355"; // Seçilen ürünün ProductName özelliği değiştirildi

 

Product silinecekUrun = northWind.Products.First(u => u.ProductID == 79);

northWind.Products.DeleteOnSubmit(silinecekUrun); // Seçilen ürünü silinecekler listesine at

 

northWind.SubmitChanges(); // Yukarıda yapılan güncellemeler veritabanına gönderildi

LINQ to SQL’de Insert, Update ve Delete İşlemleri” hakkında 6 yorum

  1. Uğur bey merhabalar öncelikle hazırlamış oldugunuz makale için teşekkür ediyorum bir konuda sorum olacaktı.
    Product guncellenecekUrun = northWind.Products.First(u => u.ProductID == 69);
    üstteki satırda .First ‘i kullanma amacımız nedir?
    İyi günler iyi çalışmalar

  2. First metodunu kullanmazsak LINQ sorgusu geriye koleksiyon döndürür. Metot kullanıldığında geriye doğrudan Product tipinden bir nesne getirilir. First’ü kullanmak zorunluluk değil ama işimizi kolaylaştırır 😉

  3. Selamlar,

    Yanılmıyorsam GetChangeSet metodu üzerinden erişilebiliyor. Context nesnenizin adı ctx ise ctx.GetChangeSet().Deletes.Count’ı dener misiniz bir olacak mı?

    Bu arada dipnot; Ado.net Entity Framework’teki SaveChanges metodu otomatik olarak etkilenen satır sayısını getiriyor.

  4. Makale çok güzel. Linq konusuna giriş yaptığım şu sıralar, verdiğiniz dataContext örnekleri çok işime yaradı.

    Toplu bir Delete işlemi için özel bir Metod yazmak da mantıklı olmuş. Ancak bahsettiğiniz gibi 100-200 hatta belki 1000 kayıdın silinmesi gereken durumlarda, (elbette ayrı ayrı 1000 tane SQL cümlesi oluşturmaktan çok daha iyi olsa da) yine de BulkDelete’in oluşturacağı SQL cümlesinin de pek performanlı olacağını sanmıyorum.

    where productID in (………1000 değişken………)

    Bunun yerine; programlama içinde 1000 tane kayıt silinmesi gerekiyorsa, muhakkak özel bir durum vardır. Mesela bahsettiğiniz gibi belli kategoriye ait kayıtların silinmesi gibi… O zaman o duruma özel SQL cümlesi oluşturacak bir Metod yazılması daha mantıklı olmaz mı??

    northWind.Products.CategoryDelete(int catID) –> where CategoryID=” ile sql cümlesi kuran,

    Ya da stokta kalmamış ürünleri silmek için
    northWind.Products.NoStockDelete() –> where UnitsInStock=0 ile SQL cümlesi kuran.

    gibi…

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir