A
B
C
Ç
D
E
F
G
Ğ
H
I
İ
J
K
L
M
N
O
P
R
S
Ş
T
U
Ü
V
Y
Z
Q
W
X
+ Ekle
LINQ to SQL

LINQ to SQL

Bu makalemizde LINQ to SQL’in yapısı inceleyeceğiz.
 
Neden böyle bir yazı hazırladık?
 
Son zamanlarda adını çok sık işittiğimiz LINQ’nün nasıl bir yapıya sahip olduğunu ve kullanıldığında bize ne gibi avantajlar sağlayacağını öğrenmek için böyle bir yazı dizisi hazırlamaya karar verdim. Bilgim dahilinde birşeyler eklemeye gayret edeceğim inşaAllah.
 
Bu yazıda genel itibariyle LINQ to SQL yapısına değindikten sonra bu yapıları örneklerle açıklamaya devam edeceğiz.
 
LINQ hakkında daha önce açılmış konularıda inceledim. Başlangıç olarak LINQ’nün özelliklerini sade bir dille anlatan Sefer Algan’nın yazısına
buradan
, güzel bir örnekle LINQ yapısına giriş yapmış olan Zafer Demirkol’un makalesine buradan
, ayrıca Microsoft’un hazırladığı 101 Örnekle LINQ konularınada buradan
göz atmakta yarar vardır. 




Bunlardan farklı olarak LINQ hakkında daha geniş bilgi edinmek isterseniz de;


1. MSDN, LINQ Projesi
ana sayfası
2. LINQ dili ile uygulamanızın içerisinden sorgu cümleleri üretmek ve öğrenmek için faydalı bir uygulama olan
LINQPad
.
3.
MSDN - Channel 9
, Anders Hejlsberg ve developer takımının yazı dizisine ulaşabilirsiniz.

Sanırım artık konuya geçebilirim.

LINQ’i genel anlamda tanımlamak gerekirse, adından da anlaşılacağı üzere dile entegre edilmiş sorgu demektir ki veritabanına ihtiyaç duyduğumuz işlemlerde önceden yaptığımız sql bağlatıları yerine, yine kod içerisinde veritabanı ile bağ kurarak aynı işlevi gerçekleştirmemizi sağlayan bir yapıdır. Visual Studio 2008 ve .Net Framework 3.x ile gelen en büyük yeniliklerden bir tanesidir. ADO.Net 3.5, ADO.Net 2.0’ın DataSet yönlü programlama modeline birçok yeni dil ve veri erişim özelliği getirmiştir.

Bu yeniliklerin amaçlarını şöyle sıralayabiliriz:


* Veri ile ilgili görevlerde (örn. İlişkisel veri tabanlarının sorgu ve güncellenmesinde, datatsetlerde ya da xml dökümanlarında) kodu kısaltıp hız kazandırmak.
* İlişkisel veriler ve sorgu sonuçları üzerinde güçlü bir tip denetimi.
* Kod ile yönetilen veri arasındaki uyuşmazlıkları azaltmak veya yok etmek.
* Çok katmanlı mimarideki Dataset entegrasyonunu arttırmak.

Bu amaçları yerine getirebilmek için Visual Studio aşağıdaki yenilikleri getirmiştir.


- Language Integrated Query (LINQ) : Çeşitli veri kaynaklarını tek bir standart dil ile sorgulamaya yarayan C# ve VB gibi dillerin derleyicilerine yapılmış bir eklemedir. SQL ifadelerine benzerlik gösterir.

- LINQ to Objects : Linq projesinin standart uygulama alanıdır. IEnumaerable ve IQueryable arayüzlerini yerine getiren koleksiyon sınıfları oluştumayı ve bunlardan oluşacak nesneler üzerinde sorgulama yapmayı sağlar.

- LINQ to SQL (eksi adıyla DLinq) : Linq to Object için SQL Server tablolarına karşılık gelen sınıfları oluşturan temel bir ORM (Object Relational Mapping) aracıdır. 

- LINQ to DataSets : ADO.Net DataSet’leri üzerinde LINQ sorgulamaları yapmayı ve DataTable’lar arasında ilişkiler kurmayı sağlar.

- LINQ to XML (eski adıyla XLinq) : Linq to Objects yapısı ile XML dokümanları üzerinde LINQ sorguları ile işlem yapmayı ve yine bu yapıyı kullanarak yeni XML dökümanları oluşturmayı sağlar.

- Entity Framework (EF) : Entity Data Model (EDM), SQLServer 200x için EntityClient.NET veri sağlayıcısı, Entity SQL (eSQL) sorgulama dili, ve ilişkili tasarım araçları, sihirbazlar ve bir veri kaynağını mantıksal bir şemaya dönüştüren araçlar içerir. Bu şema ilişkisel veri tabanı yapısındakine benzerdir.

Aşağıdaki grafikte genel yapı görülmektedir.


Programlamada örnekler ve pratik çok önemlidir. Hemen bir örnekle başlayalım.

Bir Console Application açalım ve şunları yazalım.
 

 

Bu proram, LINQ sorgu yapısını kullanarak sistemdeki 10’dan fazla Thread’e sahip işlemleri görev yöneticisindeki gibi, orderby anahtar kelimesi ile bellek kullanımına göre azalan (descending) bir şekilde sıralayarak listeleyor.
 
Eğer var procs = from proc in Process.GetProcesses() ifadesinden sonra direk olarak select proc yazsaydık dizi içindeki tüm değerleri alacaktık ve bu pek kullanışlı olmayacaktı.
 
Hatırlarsanız genelde SQL’de de  “select *”  demek yerine sadece ihtiyacımız olan alanları almaya özen gösteririz. proc nesnesinin tamamını almak yerine select ile beraber kullandığımız new operatörü ile sadece ihtiyacımız olan alanları özel bir field listesi şeklinde alabiliyoruz. Kodun çıktısı aşağıdaki gibidir :
 
{ ProcessName = devenv, Memory = 72781824, Threads = 21 }
{ ProcessName = devenv, Memory = 64450560, Threads = 23 }
{ ProcessName = svchost, Memory = 51621888, Threads = 35 }
{ ProcessName = explorer, Memory = 31342592, Threads = 31 }
{ ProcessName = taskeng, Memory = 8331264, Threads = 16 }
{ ProcessName = sqlservr, Memory = 5091328, Threads = 24 }
{ ProcessName = System, Memory = 2818048, Threads = 108 }
{ ProcessName = lsass, Memory = 1589248, Threads = 14 }

LINQ To SQL sadece ilişkisel veritabanının LINQ ile gerçekleştirilmesi değildir. LINQ To SQL ayrıca çok kolay kullanılabilir bir yapıda tasarlanmış görsel bir Object Role Modeling (ORM) aracı içerir. Bu araç bir SQL Server veritabanı içinden seçtiğimiz tablolardaki kayıt yapısına karşılık gelen sınıfları (entities) otomatik olarak üretir ve aynı zamanda yabancı anahtar ilişkilerini de kurar. Bu ilişkiler LINQ sorgularındaki join ifadelerini etkisiz hale getirir. LINQ ve Entity Framework uygulamalarında bu yapının kurulması çok önemli bir özelliktir.
 
LINQ to SQL, tablolar ile entity‘ler arasında bire bir maplemeyi (eşleştirmeyi) destekler. Yani tek bir entity sadece tek bir tablo üzerinde iş yapar. Entity Framework, birden fazla tablodan tek bir güncellenebilir entity oluşturmaya izin verir.
 
LINQ to SQL veya Designer ile Entitylere Tabloları Eşleştirmek (mapping)
 
Entity sınıfları değişiklikleri izleme desteği için INotifyPropertyChanging and INotifyPropertyChanged arayüzlerini yerine getirir.
 
Mapping işleminde;
Datacontext; veritabanına,
Table; tabloya,
Entity; tablodaki bir kayıda,
EntityRef bire çok ilişkilerde ‘bir’e,
EntitySet bire çok ilişkilerde ‘çok’a denktir diye düşünülebilir.
 
Örneğin, bir yemek siparişi düşünelim:
 
* Siparişi bir veritabanında tutmamız lazım.
* Bu veri tabanı datacontexttir. (System.Data.Linq.DataContext
* Bir tabloya ihtiyacımız olacak. Bu Table’dır. (System.Data.Linq.Table).
* Tabloya bir kayıt eklemek istersek bu bir entity olacaktır.(Siparis)
* Siparişi müşteri vermiştir.( private EntityRef _Musteri;)
* Bir siparişin, sipariş verildi, ürün tedarik edildi, ürün teslim edildi gibi birden fazla durumu olabilir. (private EntitySet _Siparis_Durums;)


LINQ ve JOIN

 
Daha önce LINQ ile Entity Framework uygulamalarının arasındaki yapı sayesinde JOIN ifadelerinin kullanımına gerek duyulan kısımlarda büyük bir kolaylık sağladığından söz etmiştik. Şimdi bu yapıyı biraz inceleyelim.
 

 

Yukarıdaki sorgu aşağıdaki gibi bir sonuç döndürecektir.
 
SAVEA 11031 04/17/2007 Chai 45
GREAL 11006 04/21/2007 Chai 46
THECR 11003 04/06/2007 Chai 4
SAVEA 10847 01/22/2007 Chai 80
SAVEA 10700 10/10/2006 Chai 5
LONEP 10317 09/30/2005 Chai 20
RATTC 10294 08/30/2005 Chai 18

Bu yapı DataContext sınıfı, içerisinde SQL Server’a gönderdiği sorguyu tutan bir Log özelliği barındırır. Bu sayede aşağıdaki gibi SQL Server’a gönderilen sorgu ifadelerini görmemize olanak sağlar.
 



Not : Yazdığımız LINQ cümleleri arka planda bir ifade ağacına(expression tree) çevrilerek bunlardan Lambda ifadeleri oluşturulur ve var değişken_adı= from… gibi başlayan ifadeleri yazıp kodu derlediğimizde, oluşturulan sorgunun SQL Server’a gitmediğini görürüz. Çünkü LINQ to SQL, sorguyu çalıştırmak için bizden sorgu ile ilgili bir istek bekleyecektir.

Genelde bu istek foreach döngüsü içerisinde meydana gelir; çünkü sorgu sonuçları içerisinde dönüşü genellikle foreach döngüsü ile yaparız.
 
Expression tree, bir sql ifade oluşturucusu (a query builder) sayesinde T-Sql sorgusuna dönüştürülür. Bu sorgu ise SqlClient.Command metodu sayesinde SQL Server’a gönderilir. Elde edilen sonuçlar geriye bir SqlDataReader nesnesi ile döner ve bu nesne EntitySet’i doldurmak için kullanılır.
 
Yukarıdaki LINQ sorgusunu Lambda ifadesi olarak da yazmak istersek;
 

 
Bu şekilde bir ifade biçimi okunabilirliği artıracaktır.
 
Daha önce de değindiğimiz gibi Entity’ler arasındaki ilişkiler EntitySet ve EntityRef’ler üzerinden yürütülür. Yukarıdaki sorguyu bu ilişkiler sayesinde yazabildik.
 
Peki ama ilişkiler kurulmamış olsaydı nasıl sorgulama yapacaktık?
 
Bunun için T-Sql’deki gibi join...on yapısı LINQ ile de gelmiş durumda. Benzer şekilde union ile yapılan resultset birleşimleri de LINQ sorguları ile yapılabilmektedir.
 
Aşağıdaki örneği inceleyelim:
 

 
T – SQL biçiminde yazacak olursak;
 

 

 

Yukarıda görüldüğü gibi Ansi Sql’deki fonksiyonlar (MIN(), MAX(), COUNT() gibi) da LINQ ile birlikte hazır olarak gelmiştir.
 
Şimdi de insert, update ve delete işlemlerinin kullanımını bir örnek uygulama üzerinden inceleyelim.
 
Yeni bir Windows Forms Application oluşturmak için Visual Studio içerisinden File > New > Project > Windows Forms Application’u  seçiyoruz.
 

 

Daha sonra Project > Add New Item > Linq To Sql classes’ı seçtikten sonra aşağıdaki name kısmına “Alisveris.dbml” yazarak projemize ekliyoruz.
 
Karşımıza Object Relational Designer penceresi çıkacaktır. Toolbox’taki Object Relational Designer başlığı altından Class sembolünü designer penceremiz üzerine sürüklüyoruz.
 
Boş bir class yapısı ile karşımıza çıkacaktır. Şimdi burada yapacağımız işlem, veritabanında varolduğunu düşündüğümüz bir tabloyu şekil olarak canlandırmak olacaktır.
 
Sürükleyip bıraktığımız class’a sağ tıklayarak Properties’i seçiyoruz. Class1’in özelliklerinden Name alanını “Urun” olarak değiştiriyoruz ve source alanına da Urun yazıyoruz. Source, bu classın veri tabanındaki hangi tabloyu temsil ettiğini gösterecek.
 
Aynı sekilde 2 class daha sürükleyip bırakarak birinin Name alanını “Musteri”, diğerininkini de “Siparis” olarak değiştirelim ve Source alanlarına da aynı isimleri verelim.
 
Şimdi ilk eklediğimiz Urun sınıfına dönelim:
 
Bu sınıfa 4 adet Property ekleyeceğiz. Id, Ad , Fiyat ve StokId’ye sağ tıklatıp Properties’i seçtiğimizde; Type kısmını int (System.Int32) olarak belirliyoruz. Çünkü bu alan integer tipinde ve otomatik artan olacaktır. Daha sonra AutoGeneratedValue değerini True yapıyoruz. Primary Key değerini de True olarak seçelim. Data kısmındaki değerleri belirtmezsek Designer uygun tipleri otomatik olarak seçecektir.
 
Şimdi Ad alanı için Properties’e girerek Type’ı string yapalım. Fiyat alanını ise benzer şekilde decimal yapalım. Stok alanını ise integer yapalım.
 
İkinci olarak eklediğimiz Musteri sınıfına sıra geldi. Buraya da Urun’deki ile aynı özelliklerde bir Id alanı ve string türünde Ad, E-mail ve Sifre alanları ekleyelim.
 
Son olarak Siparis sınıfına Id, MusteriId, UrunId ve adet alanları ekliyoruz. Id alanı yine daha önce yaptığımız özelliklerde Primary Key alanı olacaktır. Aynı şekilde diğer üç alan da integer türünde olmalıdır.
 

 

Tüm bu işlemleri yaptıktan sonra, sıra tablolar arasındaki ilişkileri kurmaya geldi.
 
Designer’a sağ tıklayıp Add > Association seçelim.
 
Burada Parent Class Primary Key tablosu, Child Class ise Foreign Key tablosudur. Parent class olarak Urun ve alttaki Urun Properties’ten Id alanını, Child Class olarak da Siparis ve hemen altındaki Siparis Properties’den UrunId alanını seçerek Ok’e basıyoruz.
 
Böylece ilk ilişkimizi oluşturduk. Burada yaptığımız Urun tablosundaki bir kayıda karşılık Siparis tablosunda birden fazla kayıt olabileceğini belitmekti. Yani bir urun birden fazla kişinin Siparisinde olabilir.
 
 

Daha sonra bir müşterinin birden fazla siparişinin olabileceğini belitmek için Designera sağ tıklayıp Add > Association seçerek yeni bir ilişki daha ekliyoruz.
 
Burada ise Parent Class’ı Musteri olarak seçeceğiz ve ilişkide Id alanından faydalanacağımızı belirteceğiz. Child Class olarak ise Siparis’i seçerek buradaki MusteriId alanının foreign key olacağını belirteceğiz.
 

 
Evet, artık örnek projemizde kullanacağımız veri yapısını tasarladık ve şimdi hangi veritabanını kullanacağımızı seçmeye sıra geldi.
 
Bunun için önce Alisveris.dbml’i seçili hale getirip, Designer Properties penceresininden en altta Connection özelliğine tıklayıp açılan listeden new seçeneğini seçiyoruz.
 
Açılan pencerede veritabanı seçmeyeceğiz çünkü ilerleyen kısımda designerın bizim için otomatik olarak veri tabanını oluşturmasını sağlayacağız. Sadece hangi Sql Server instance’ını kullanmak istediğimizi belirleyip Ok dememiz yeterli olacaktır.
 

 
Şimdi Alisveris.dbml dosyasını kaydedip kapatalım.


Insert İşlemi:
 
Bir müşteri, bir ürün ve bu müşteri ve ürünü içeren bir sipariş eklediğimizi düşünelim.
 

 
Update İşlemi:
 
E-mail adresi
[email protected]

olan müşterinin e-mail adresi ve şifre bilgilerini güncelleyelim.
 

 
Delete İşlemi:
 
E-mail adresi
[email protected]

olan müşterinin siparişini silelim.
 

 


  • diline pelesenk olmak ne demek
  • dillere pelesenk olmuş ne demek
  • pelesenk
  • pelesenk ne demek
  • Pelesenk Ne Demek – Pelesenk Sözlük Anlamı
  • pelesenk olmak ne demek
  • pelesenk olmak ne demektir
  • pelesenk olmuş ne demek
  • Yüksek Yüksek Tepelere sözleri