LINQ2SQL'e Giriş

0 dakikada yazıldı

17717 defa okundu

Düzenle

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ı.
Ö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.
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.
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.