Daha önceki makalelerimde Entity Framework ve ORM hakkında bazı bilgileri sizler ile paylaşmıştım. Bu yazıda ise Entity Framework kullanarak bir Database üzerinden nasıl sorgulama yapacağımıza bakacağız. Veritabanı üzerinde sorgulama yapabilmek için bizim programımız ile veri tabanımız arasında bir bağ oluşturmamız gerekmektedir. Bu bağı da ya ADO.NET mimarilerinden biri ile ya da herhangi bir ORM tool’u ile sağlayabiliriz veya third party component ile sağlayabiliriz. Bu makalemde ise ORM kullanarak var olan bir veri tabanı üzerinde sorgulama işlemi yapacağız.
Eğer ADO.NET mimarilerinden biri ile bağlantı sağlayacak olsaydık, mutlaka o veri tabanı üzerinde sorgulama işlemi yapmak için SQL kullanmak zorunda kalacaktık.
Soru : Peki ORM yani Microsoft tarafındaki ORM tool olan Entity Framework ile sorgulama işlemini nasıl yapacağız?
Cevap : Elimizde bu işlem için uygun çok güzel bir teknoloji var :)
Soru : Tekrar SQL mi kullanacağız?
Cevap : Tabi ki Hayır.
Soru : Peki, nedir bu teknoloji?
Cevap : LINQ.
Bize sağlayacağı sadece SQL yazma derdinden mi kurtarmak?
Kısa cevap, hayır. Uzun cevap : Şimdi Entity Framework kullanırsak eğer, veri tabanı modelimizi projemize import ettikten sonra model üzerinde bulunan her bir tablo bize Object olarak sunuluyor. Biz de OOP ile harmanlayarak sorgulama yapmak istediğiniz tablolar arasından ilgili alanlar için bir Class içerisine Property tanımlayarak, istediğiniz şekilde verileri çeker alırız. Böylelikle hem veri tabanımızın güvenliği artmış olur hem bizim kod yazmamız hızlanır , hem projemiz daha düzgün gözükür , gereksiz bir çok tür dönüşümü ile uğraşmayız , gereksiz veriler arasında dolanıp durmayız … Daha birçok faydası mevcuttur.
Soru : Peki tüm bu sunulanlar çok güzel. Fakat ya hız?
Cevap : Ado.Net daha verimli çalışmakta.
Soru : LINQ ‘ i sadece veri tabanı sorgulama işlemlerinde mi kullanabiliriz?
Cevap : Hayır. Object List’lerin hepsinde kullanabiliriz.
Umarım giriş bölümünden kafamızda LINQ ‘ i oluşturabilmişizdir. Niçin kullanılır? Faydaları nelerdir? SQL yerine neden LINQ kullanırız? Nerelerde kullanırız? gibi soruları yanıtladıktan sonra isterseniz LINQ ‘ in syntax ini inceleyelim.
Aslında LINQ syntax i eğer SQL komutları yazdıysak daha önceden bize hiç de yabancı gelmeyecektir. Çünkü LINQ yazımında kullanılan keywordler SQL keywordleri ile neredeyse aynı. Basit bir örnek üzerinde syntax’i görelim.
Mesela veri tabanımızdan çalışanlar ile ilgili tüm verileri tek bir tablo üzerinden çekecek olursak ,
var TumCalisanlar = from calisanlar in calisanListesiselect calisanlar;
Evet arkadaşlar biz bu sorgulama işlemini eğer SQL kullanarak yapacak olsaydık eğer ,
select * from calisanListesi şeklinde bir SQL komutu yazmamız gerekecekti. Farkettiyseniz “from” ve “select” keyword leri aynı şekilde kullanılmıştır. Tek fark “in” keyword’u. LINQ Syntax i ile aslında biz şu şekilde emir veriyoruz ; “calisanListesi içerisindeki tüm verileri çalışanlar diye bir değişkene aktar ve bu değişkenin içerisindeki tüm herşeyi seç ve TumCalisanlar değişkenine bu seçtiklerini ata.” diyoruz. Böylelikle bize son derece esnek bir yapı sağlanmış oluyor. Biz LINQ kullanarak C# yapısında bulunan türleri, kendi oluşturduğumuz Class ları, objeleri aslında SQL komutları ile birleştiriyoruz. Böylelikle bir tarafta SQL yazayım sonucunu alayım sonra C# üzerinde işlemler yapayım dönüşümleri sağlayayım falan filan gibi gereksiz birçok işlemden kurtulmuş oluyoruz.
Peki, bir tablodan veri çekerken bir filtreleme işlemi gerçekleştirmek istiyoruz. Nasıl yaparız?
– Bu sorunun cevabını hem SQL ile hem de LINQ ile göreceğiz. SQL kullanırsak eğer :
select * from calisanListesi where yas>30
(gibi bir filtreleme işlemi olsun)
– Bu işlemin LINQ tarafı ise şu şekilde :
var TumCalisanlar = from calisanlar in calisanListesi where calisanlar.Yas>30select calisanlar;
Görüldüğü gibi her iki sorgulama işleminde de filtreleme işlemi için “where” keyword u kullanılıyor.
Peki, bir tablodan sadece bir kolondaki tüm verileri nasıl çekeriz?
– SQL kullanarak :
select adi from calisanListesi
– LINQ kullanarak :
from calisanlar in calisanListesi select calisanlar.adi;
Peki bir tablodan birden çok kolondaki bilgileri nasıl çekeriz?
– SQL tarafında : select ifadesinden sonra istediğimiz kolon isimlerini virgül ile yan yana yazarak alabiliriz.
– LINQ tarafında ise :
from calisanlar in calisanListesi select new { calisanlar.adi , calisanlar.yasi};
olarak istediğimiz kolonları alabiliriz. Bu sayede bu sorgudan çıkan sonuç yeni bir tür olarak tutulur. Bu veri kümesini istediğimiz gibi kullanabiliriz.
Peki, birden çok tabloyu birleştirerek sorgulama işlemi nasıl yaparız?
– SQL tarafında :
select * from calisanListesi join Yetkiler on calisanListesi.ID = Yetkiler.CalisanListesiID
– LINQ tarafında ise :
from calisanlar in calisanListesi join yetkiListesi in Yetkiler oncalisanlar.ID equals yetkiListesi .CalisanListesiID
Evet arkadaşlar basit anlamda LINQ sorgulama işlemini anlatmaya çalıştım. Mümkün olduğu kadar SQL ile kıyaslamalı örnekler vermemin nedeni zaten SQL yazıyoruz, LINQ i görüp kaçmamamızı sağlamaktı :) Umarım faydalı olmuştur. LINQ üzerinde bu makalede sadece sorgulama işlemi yaptık. Insert Update ve Delete işlemlerini başka bir makalemde anlatacağım. LINQ i Lambda Expressions’la kullanırsanız çok daha faydalı olacaktır. Lambda Expressions’ı da fırsat bulursam anlatacağım.
Bu konuyla ilgili sorularınızı alt kısımda bulunan yorumlar alanını kullanarak sorabilirsiniz.
Referanslar