Yazılımcının Günlüğü | YazilimGunlugu.Com
Arama
Makale Kategorileri
Üye Girişi
Şuanki online üyeler()
Aktif üye bulunmamaktadır.


LINQ: Language Integrated Query - 2

Yazar: Kadir Sümerkent

Kategori: .NET Framework

Eklenme Tarihi: 27.01.2008 13:15:24

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.

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<Customer> 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<Customer> customers;
public Table<Orders> 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() + "\t" + o.Customer + "\t" + 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üyoruz
var 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ıyoruz
var 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ıyoruz
var 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() + "\t" + 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.

Kadir Sümerkent
http://www.sumerkent.com

Tema
Anket
ASP.NET MVC'yi Projeleriniz de kullandınız mı?


En Çok Okunan Makaleler
En Son Eklenen Makaleler
Soru Merkezinde Bekleyenler
Ana Sayfa | Hakkımızda | Editörler | Yazarlar | RSS RSS | İletişim
Yazılım Günlüğü 2007-2009 © Tüm Hakları Saklıdır.