ASP.NET
Network Akademi

Met Hostimg

“Bilgi paylaşıldıkça artar” sloganı ile .NET Platformuna ilişkin birikimlerin paylaşıldığı ASP.NET.TR Topluluğunda sizde “YAZAR” olmak için ; info@asp.net.tr e-mail adresine kendinizi anlatan bir e-mail göndererek başvuruda bulunabilirsiniz.

LINQ2SQL e Giriş

Daron YÖNDEM
LINQ
10.03.2010 15:34:14
Hit : 8434

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.




BU İÇERİĞE YORUMDA BULUNUN


Bu MAKALE'ye yorum yapabilmek için Üye olmalısınız ...!


BU İÇERİĞE YAPILAN YORUMLAR