LINQ: Language Integrated Query - 2

LINQ: Language Integrated Query - 2 LINQ: Language Integrated Query - 2

Yazı dizisinin ilk bölümünde bir collection üzerinde Linq ile küçük işlemler yapmıştık. Bu makalede gerçek hayata hızlı bir geçiş yapıp Linq"i SQL Server ile entegra olarak nasıl kullanabileceğimize bakıyor olacağız. Hızlıca konuya girelim.

LINQ, kullanılan programlama dilinin sözdizimi ve compile-time ortamından uzaklaşmadan, programlama dilinin sunduğu bir özellik olarak ilişkisel veri kaynaklarını sorgulamak için kullanılabilir. Kod adı D-Linq olan bu özellik sayesinde SQL şema bilgisinin CLR metadatasıyla entegrasyonunun sunduğu güçlü bir altyapıya kavuşmuş oluruz. Bu entegrasyon SQL tablo ve view tanımlamalarını CLR türlerine compile ederek tüm .NET dilleri tarafından erişilebilir hale gelmelerini sağlar.

DLinq [Table] ve [Column] adında iki temel attribute sunar. [Table] attributeu bir classa uygulanır ve CLR türünü SQL tablosu veya viewı ile ilişkilendirir. [Column] attributeu ise tüm fieldlara ve/veya propertylere uygulanabilir ve ilgili üyeyi, belirli bir SQL sütunu ile ilişkilendirir. Her iki attributeda SQL-spesifik metadatanın tutulabilmesini sağlamak için çeşitli parametreler sunmaktadır.

Ve örnek:Çok sıradışı olarak kişi-sipariş örneğinden ilerleyelim.

İşe örnekte kullanacağım tabloları veritabanında (dlinqsample) oluşturarak başlıyorum:

Örneğimizde kullanılacak tabloları oluşturan T-SQL komutları

create table Customer ( Name nvarchar(30)primary key not null,  Age int not null,  City nvarchar(15) not null, VIP bit not null) 

create table Orders ( OrderID int primary key not null IDENTITY (1, 1),  Customer nvarchar(30) not null,  Amount int)

 Bu tabloların CLR karşılıkları aşağıdaki gibi olacaktır:

Örneğimizde kullanılacak tabloları oluşturan T-SQL komutları

[Table(Name="Customer")]public class Customer{ [Column(DBType = "nvarchar(30) not null", IsPrimaryKey = true)] public string Name; [Column] public int Age; [Column] public string City; [Column] public bool VIP;}

[Table(Name = "Orders")]public class Orders{ [Column(DBType = "int not null", IsPrimaryKey = true)] public int OrderID; [Column(DBType = "nvarchar(30) not null")]   public string Customer; [Column] public int Amount;}

Ben tablolara örneklerde kullanmak için bir kaç veri ekledim. (Kodları denediğinizde karşınıza boş ekranlar gelirse bunu sizde yapın (: )

İlk olarak sadece müşteri listesini alacak bir form oluşturalım, Formun tasarımında sadece bir listbox kontrolü olacak. Formun load olayı ise aşağıdaki gibi olacak:

Veri erişiminde kullandığım class ve formun load olayı

public class midLayer : DataContext{public Table customers;public midLayer(string connectionString):base (connectionString){}}

private void Form1_Load(object sender, EventArgs e){midLayer m = new midLayer("Data Source=ROOT; Initial Catalog=dlinqsample; User Id=sa; Password=q1w2e3r4t5");var customerList = from clist in m.customers select clist; 

foreach (var c in customerList){listBox1.Items.Add(c.Name);}}

Sonuç

Ben sadece Name özelliğini yazdırdığım için ListBox içinde müşterilerin adlarının listesini görüyoruz.

Şimdi bu müşterilerin verdikleri siparişleri görüntüleyelim:Aşağıdaki kodda görebileceğiniz gibi midLayer sınıfına bir satır ekleyerek Orders tablosunuda erişilebilir hale getiriyoruz.

midLayer"ın güncellenmiş hali ve sipariş listesi formu (form2)

public class midLayer : DataContext{public Table customers;public Table orders;public midLayer(string connectionString):base (connectionString){}}

Form2_Load eventı

private void Form2_Load(object sender, EventArgs e){midLayer m = new midLayer("Data Source=ROOT; Initial Catalog=dlinqsample; User Id=sa; Password=q1w2e3r4t5");

var orderList = from olist in m.orders select olist;

foreach (var o in orderList){listBox1.Items.Add(o.OrderID.ToString() + " " + o.Customer + " " + o.Amount.ToString());}}

Runtime sırasında Form2"nin görünümü

Sırada üçüncü formu hazırlayarak bu iki tablodaki verileri bir araya getirmek ve müşteri bazında siparişleri listelemek kalıyor:

Form yüklendiğinde yapacağımız işlem combobox kontrolüne veritabanındaki müşterileri yüklemek:

form3"ün load eventi

//müşterileri yüklüyoruzvar customerList = from clist in m.customers select clist;foreach (var c in customerList){ comboBox1.Items.Add(c.Name); }

Form3"ün yüklendiği andaki görünümü ComboBox1"in SelectedIndexChanged olayına ise sorgulamayı yaparak sonuçları görüntüleyecek olan aşağıdaki kodları yazıyoruz.

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e){listBox1.Items.Clear(); 

//müşteri bilgilerini yazdırıyoruzvar customer = from clist in m.customers where clist.Name == comboBox1.SelectedItem.ToString() select clist;

foreach (var c in customer){lblCustomerName.Text = c.Name;lblCustomerAge.Text = c.Age.ToString();lblCustomerCity.Text = c.City;lblCustomerIsVIP.Text = c.VIP.ToString();} 

//sipariş bilgilerini yazdırıyoruzvar OrderHistory = from orderlist in m.orders   join customerlist in m.customers   on orderlist.Customer equals customerlist.Name   into result   where orderlist.Customer ==  comboBox1.SelectedItem.ToString()  

select new { Name = orderlist.Customer, OrderId = orderlist.OrderID, OrderAmount = orderlist.Amount }; 

foreach (var result in OrderHistory){listBox1.Items.Add(result.OrderId.ToString() + " " + result.OrderAmount.ToString());}}

Ve comboboxtan seçim yapıldığında karşımıza aşağıdaki görüntü çıkıyor

Geldiğimiz noktada Linq"i (daha doğrusu bu makalede DLinq"i) kullanarak SQL Server"a bağlanarak sorgulamalar yaptık ve sonuçları görüntülemeyi gördük. Bir sonraki makalede Linq"in yapısal özelliklerini  ele alıyor olacağız.

Makalede geliştirdiğim örnek uygulamayı burayı tıklayarak download edebilirsiniz.

Döküman Arama

Başlık :

Kapat