Blogumu sürekli takip edenler hatırlayacaklardır, bundan yaklaşık bir ay
kadar önce LINQ'den ufak bir yazıyla bahsetmiştim ve daha VS 2008 çıkmadığı için
biraz daha sabretmemiz gerektiğini belirtmiştim. Artık elimizde VS 2008
bulunduğuna göre LINQ'yu yavaş yavaş biraz daha incelemekte fayda var. Emin olun
çok şaşıracaksınız.
Bu yazım boyunca Visual Web Developer 2008 Express
kullanacağım. Yeni bir ASP.NET 3.5 web sitesi yaratarak
başlayalım. Örnek boyunca ben kendi makinemde kurulu SQL2005 üzerindeki "forum"
adındaki bir veritabanından faydalanacağım. Veritabanımın yapısını aşağıdaki
şema içerisinde inceleyebilirsiniz.

Örnek veritabanı tasarımı.
Bu veritabanı üzerinden yola çıkarak ASP.NET 3.5 sitemde LINQ2SQL kullanarak
veriye ulaşmaya çalışacağım. İlk olarak projemize bir "LINQ2SQL Class"
dosyası eklememiz gerekiyor. Bunun için hemen "Solution Explorer"
içerisinde projeye sağ tuş tıklayarak "New Item" demeniz
yeterli.

Yeni bir DBML dosyası yaratıyoruz.
Dosyayı projenize eklediğiniz gibi karşınıza farklı bir arayüz gelecektir.
Bir sonraki adımda Visual Studio içerisinde "Database Explorer"
panelinden SQL sunucunuza ve veritabanınıza bağlanmanız gerekiyor. Aslında işin
bu bölümü Visual Studio 2005'den pek farklı değil. Bağlantıyı sağladıktan sonra
veritabanınızdaki istediğiniz tabloları sürükle&bırak tekniği ile orta
pencereye, yani DBML dosyasına aktarabilirsiniz.

Veritabanından DBML dosyasına yolculuk.
Artık DBML dosyası kaydederek çıkabiliriz. Eğer isterseniz tabloların yanı
sıra Store Procedure'lerinizi de DBML dosyalarına ekleme şansınız var. Peki "ekledik
de ne oldu?" diyenlerdenseniz buyurun devam edelin.
Projemize ait default.aspx dosyasının Code-Behind sayfasına
geçerek kodumuzu yazmaya başlayalım.
Dim datalarim As New DataClassesDataContext
Yukarıdaki satır ile tanımladığımız değişkenimizin bizim DBML dosyamızdaki
LINQ nesnelerine ulaşmamızı sağlayacak böylelikle kolayca veritabanından istekte
bulunabileceğiniz. Gelin hemen aşağıdaki kodumuz ile bakalım nasıl veri
çekeceğiz.
Dim SeciliMesajlar = From Secililer In datalarim.Mesajlars Where Secililer.MesajText.Contains("DARON")
LINQ'yu ilk olarak görenler için yukarıdaki kodun ne kadar garip gözüktüğünün
farkındayım :) İlk olarak yarattığımız değişkene bir bakalım.
SeciliMesajlar adında bir değişken yaratarak LINQ sorguma eşitliyorum.
Aslında yarattığım SeciliMesajlar değişkeninin tipi
System.LINQ.IQueryable(of Mesajlar) şeklinde. Yani özetle bana Mesajlar
nesnesinin bir listesinden oluşan ve LINQ ile sorgu gönderebileceğim bir yapı
döndürülecek. From dedikten sonra tamamen "kafadan sallama"
bir tablo adı tanımlıyorum. Bunu SQL sorgularındaki tablolar gibi
düşünebilirsiniz. Geçici bir süre için sadece sorgumda kullanılmak üzere bir
tablo adı yaratıyorum. Bu tablonun bir önceki satırda yarattığım
datalarim veri katmanından Mesajlar tablosundan veri
alacağını belirtmek için In deyimini kullanıyorum. Bundan
sonrası aslında artık SQL sorguların çok benziyor. Where
deyimini kullanarak "kafadan sallama" olarak yarattığım tablonun
MesajText kolonunda "DARON" metni geçenlerin geri
döndürülmesini sağlamak üzere LINQ sorgumu düzenliyorum.
Bu sorgudan geri dönen SeciliMesajlar değişkenini direk
DataSource olarak kullanabilirsiniz. Eğer sayfanıza bir
GridView eklerseniz aşağıdaki gibi DataBind yapma
şansınız olacaktır.
GridView1.DataSource = SeciliMesajlar
GridView1.DataBind()
Gördüğünüz gibi veritabanına erişim bu kadar kolaylaşmış durumda. Aslında
eski günlere döndüğümüzde LINQ2SQL'in yaptığı işi yapan harici araçlar
kullanarak veritabanlarına göre otomatik şablonlar hazırlayarak şablonlar
üzerinden veri katmanı kodları yaratıyorduk. Tabi hiçbiri LINQ'nun getirdiği
esnekliğe sahip olmuyordu ama konsept olarak aynı amaca hitap ettiklerini
söyleyebiliriz.
Peki arkaplanda neler oluyor?
İş bu kadar kolaylaşmışken hemen akla "Performans???" sorusu geliyor
:) Acaba bu sorgular direk SQL'de mi çalışıyor yoksa GridView'ın Paging
özelliği gibi :) ASP.NET tüm veriyi SQL'den IIS'e alıp orada mı sorguluyor? Bu
soruya cevap bulmak için SQL Management Studio'yu açarak Activity
Monitor üzerinden sunucuya gönderilen sorgulardan birini yakaladım.
(@p0 nvarchar(7))
SELECT [t0].[MesajID], [t0].[MesajText], [t0].[MesajDate],
[t0].[LoginID], [t0].[KonuID], [t0].[IsHTML]
FROM [dbo].[Mesajlar] AS [t0]
WHERE [t0].[MesajText] LIKE @p0
Yazdığımız LINQ kodu yukarıdaki SQL koduna çevrilerek SQL sunucusuna
gönderilmiş. Gerçekten muhteşem :) Gerekli parametre tanımlanmış doğru sorgu
oluşturulmuş ve birleştirilmiş. Bunun üstüne söyleyecek söz yok.
Sanırım artık SQL tarafında sorguları hazırlayıp projelerimi kopyala-yapıştır
yapmaktan kurtulacağız :) Tabi daha LINQ ile ilgili anlatacak çok şey var.
İleriki yazılarda daha derinlere dalmak ümidiyle.
Hepinize kolay gelsin.