101 Linq Örneği - Part I

Merhabalar,

Bugün C# 3.0 ile hayatımıza giriş yapan LINQ (Language Integrated Query) teknolojisini daha etkin kullanabilmek için örnek sorgular gerçekleştireceğiz. 

Bu yazımızda kendimize soracağımız sorular şunlar olacak:

  1. Linq ile insert, update, delete işlemlerini nasıl gerçekleştiririm?
  2. Linq ile karmaşık select sorgularını nasıl yazarım?

İki ana başlıkta toplamaya çalıştığım sorulara yanıt aramaya çalışacağız ve Linq teknolojisi kullanarak programlarımızda nasıl zaman tasarrufunu gerçekleştirdiğimizi aynı zamanda program yazmayı nasıl  daha eğlenceli hale getirdiğimizi hep beraber göreceğiz.

Ben Linq hakkında giriş bilgisine sahip olduğunuzu düşünerek örnekler yardımıyla söz konusu teknolojiye derinlemesine hakim olmanıza yardımcı olmaya çalışacağım. Bunun için öncelikle Visual Studio içerisinde bir Console projesi açalım ve projeniz üzerine sağ tık "Add / New Item / ADO.NET Entity Data Model" yoluyla projenize bir entity ekleyin. Açılacak bir sonraki pencerede "Generate From Database" varsayılan olarak işaretli gelecektir Next tuşu ile devam edin. Sırada veritabanınızı seçme işlemi var. Burada Northwind veritabanını seçin ve devam edin. Bu noktada dikkat etmeniz gereken nokta Visual Studio'nun App.Config dosyanıza bağlantı sözcüğünüzü otomatik ekliyor olmasıdır. Söz konusu connection string'i aklınızda tutmanız sizin için faydalı olacaktır. Zira programlarımızı yazarken bu bize lazım olacaktır.

ConnectionString

Next diyerek bu adımı da gerçekleştirdikten sonra son aşamaya geldiğimizin müjdesini verebilirim :) Bu aşamada bize sorulan soru şudur : "Hangi database nesnelerinin model içinde yer almasını istiyorsunuz?". Burada resimde de görüldüğü üzere tablolarımız haricinde Stored Procedure ile View'leri de modelimize dahil edebiliriz. Bunun haricinde altta yer alan iki checkbox'tan birincisi sahip olduğumuz nesnelerimizin çoğul isimlerini otomatik olarak oluştururken ikincisi ise yabancıl anahtar (foreign key) kolonlarının model içerisinde yer almasını sağlamaktadır.



Entity Model'imizi projemize ekledikten sonra Linq sorgularımızı yazabiliriz. Hadi şimdi birlikte yazının başındaki sorularımıza cevap arayalım. 

Öncelikle insert, update, delete;

  • Soru : Kategoriler (Categories) tablosuna kayıt ekleme işlemini nasıl gerçekleştirebiliriz?
        public static bool Insert()
        {
            using (NorthwindEntities entity = new NorthwindEntities())
            {
                Category yeniKategori = new Category { CatName = "Sea food", Description = "This is a sea food" };

                entity.AddToCategories(yeniKategori);

                return entity.SaveChanges() > 0 ? true : false;
            }
        }



Hazırlamış olduğumuz Entity Modelimizden bir instance alarak eklemek istediğimiz kategoriyi AddToCategories() metodu yardımıyla veritabanımıza ekliyor ve daha sonra da değişiklikleri kaydetmesi için SaveChanges() metodunu çalıştırıyoruz. Burada dikkat edilmesi gereken nokta söz konusu metodun int dönmesidir. Biz bu sayede ekleme işlemimizin başarılı olup olmadığı bilgisini metottan alabiliyoruz. Son olarak kod bloğumuzu using içinde yazmamızın nedeni ise ekleme işlemi sonunda entity nesnesinin "Garbage Collector" yardımıyla RAM üzerinden atılmasını gerçekleştirerek gereksiz yere RAM'de durmasının önüne geçmektir.


  • Soru : Kategoriler tablosu üzerinde güncelleme işlemini nasıl yaparız?
        public static bool Update()
        {
            using (NorthwindEntities entity = new NorthwindEntities())
            {
                Category kategori = new Category { ID = 36, CatName = "New Sea food", Description = "This is a new sea food" };

                var originalCategory = entity.Categories.Where(c => c.ID == kategori.ID).SingleOrDefault();

                entity.Categories.ApplyCurrentValues(kategori);

                return entity.SaveChanges() > 0 ? true : false;
            }
        }


Güncelleme işlemi önce orjinal bilginin elde edilip daha sonra yeni gelen ile değiştirilmesi ile gerçekleştiriliyor.

  • Soru : Kategoriler tablosu üzerinde Delete işlemini nasıl yaparız?
        public static bool Delete(int ID)
        {
            using (NorthwindEntities entity = new NorthwindEntities())
            {
                var silinecek = from c in entity.Categories
                                where c.ID == ID
                                select c;

                entity.DeleteObject(silinecek.SingleOrDefault());

                return entity.SaveChanges() > 0 ? true : false;
            }
        }


Silme işlemi de öncelikle silinecek değerin Categories varlığımızın içinde bulunması ile gerçekleşmektedir. Sonraki aşamalar ise yukarıdaki Insert() ve Update() metotlarının birer taklididir.

Insert, Update, Delete sorgularımızı inceledikten sonra 3 adet select işlemi yaparak Linq örmekleri ile ilgili yazı serimizin ilkini noktalayalım.

  • Soru : Tüm kategorileri nasıl getirebiliriz?
        public static List<Category> TumKategoriler()
        {
            using (NorthwindEntities entity = new NorthwindEntities())
            {
                var kategoriler = from c in entity.Categories
                                  select c;

                return kategoriler.ToList();
            }
        }


Söz konusu kategorileri içine sadece Category class'ını alan bir List olarak döndürmek mantıklıdır. Peki bu liste nasıl hazırlanacak? Cevabı oldukça basit, entity.Categories içindeki tüm elemanlar seçilecek (select c). Sonrasında da dönüştürme operatörü (ToList) ile bunu metodun dışına göndereceğiz.

Bu noktada yazdığımız metodun nasıl kullanacağını da gösterirsek bu sorunun cevabını tam olarak vermiş oluruz;


        static void Main(string[] args)
        {
            foreach (var item in TumKategoriler())
            {
                Console.WriteLine(item.CatName);
            }
        }             


TumKategoriler() bir list olduğu için bu listenin içinde foreach döngüsü ile gezerek elemanlarını tek tek ekrana yazdırabiliriz. Yukarıda olduğu gibi.

  • Soru : ID'ye göre seçme işlemini nasıl yapabilirim? Örneğin ID'si 2 olan bir Category'i nasıl seçebilirim?
        public static Category CategoryGetirByID(int ID)
        {
            using (NorthwindEntities entity = new NorthwindEntities())
            {
                var kategori = from k in entity.Categories
                                     where k.ID == ID
                                     select k;

                return kategori.SingleOrDefault();
            }
        }

Bunun için kategoriler içinde gezerek kategori id'si istenilen id'ye eşit olan kayıt bulunur. Daha sonrasında da o kayıt metot dışına gönderilir.

  • Soru : Kaç adet kategoriye sahip olduğumu nasıl görebilirim?
        public static int KategoriAdet()
        {
            using (NorthwindEntities entity = new NorthwindEntities())
            {
                var kategori = from k in entity.Categories
                               select k;

                return kategori.Count();
            }
        }

Burada imdadımıza yetişen görüldüğü gibi Count() metodu oldu.

Sonuç olarak bu yazımızda Linq ile daha az kod yazıp daha az zaman israfı gerçekleştirdik ve kod dünyasının daha keyifli bir hal aldığını gördük.

Bir sonraki yazıda görüşmek üzere :))

0 yorum:

Yorum Gönder