Merhabalar,
Uygulama notlarım arasına almayı düşündüğüm bir konu için daha başlık açtım.Linq Nedir? LinqToSql Nedir? için her yerde bulabileceğimiz bir kaç tanımı öncelikle yazalım daha sonrasında da örnek bir uygulama ile kapanışı yapmış oluruz.
–> LINQ Nedir ?
Program ve veri arasındaki ilişkiyi başka bir boyuta taşıyan devrimsel bir programlama metodolojisidir.bir programlama arayüzü sunar. C sharp diline getirdiği eklentilerle sql benzeri tek bir söz dizimi ile farklı tiplerdeki verilerin sorgulanmasını sağlar.
–> Farklı Linq Uygulamaları Nelerdir ?
linq to object : bellek üzerindeki nesnelerden oluşan koleksiyonları sorgular
linq to sql :sql server daki tabloları sorgular
linq to dataset : ado.net dataset verilerini sorgular
linq to xml : xml veri kaynaklarını sorgular
linq to entity : ado.net entity framework tarafından oluşturulan varlıkları sorgular
–> Linq Neden Kullanılmalı ?
Linq,kodlarımız içeisinde farklı bir dil kullanmadan,çeşitli ortamlardaki veriyi sorgulamamızı ve ve filtrelememiz için kullanılır.Linq öncesinde daha çok kod ile yapılan bu işlemler linq u ile daha basit hale getirilmiş oldu.
— Standart Sorgu Operatörleri
— LINQ bir veri kümesinde sorgulama yapma eleman seçme sıralama gibi genel amaçlı işler için bütün .net dilleri tarafından kullanılan standart sorgu operatörlerini sunar.Bu operatörleri IENUMERABLE arayüzünü uygulamış tüm veri kaynakları için kullanır.aşağıda da linq sorgularını dizi tanımlayan basit bir program üzerinde görebiliriz.
string[] sehirler = { “Ankara”, “İstanbul”, “Aydın”, “Antalya”, “İzmir”, “Konya”, “Aksaray”, “Kocaeli” };
IEnumerable<string> sorgu = from s in sehirler where s.StartsWith(“A”) == true orderby s select s.ToUpper();
foreach (string i in sorgu)
{
Console.WriteLine(i); Console.ReadLine();
}
—–>>>>>>>>< yazılan bu sorgunun metot tabanlı versiyonu ise
IEnumerable<string> sorgu2 = sehirler.Where(s => s.StartsWith(“A”) == true) .OrderBy(s => s) .Select(s => s.ToUpper());
şeklindedir.
—->> LAMBDA İFADELERİ
–> lambda where orderby ve select operatörlerine aktarılan parametreler olarak alınan ifadeleri temsil eder
* WHERE – veri kümesini filtreler,bunun için şart içinde bool tipi veri döndüren bir ifade kullanılır
* ORDERBY -veri kümesinde sıralama yaptırır,artan yada azalan olarak ifade edilir
* SELECT -hangi üyelerin alınacağınu belirtir
–> linq sorgu süreci 3 adımdan oluşur ; ayrıca linq sorgusunun çalıştırılması sorgunun kendisinden ayrı bir süreçtir.sorgu oluştruulurken veri elde edilmez
// 1) Veri Kaynağı tanımlanır
int[] sayilar = new int[5] { 1, 2, 3, 4, 5 };
// 2) Sorgu Oluşturma
var tekSayilar = from s in sayilar where (s % 2) == 1 select s;
// 3) Sorgunun Çalıştırılması
foreach (int s in tekSayilar) { Console.WriteLine(s); }
–> Örnekteki sorgu kümesinin bellekte tutulması için tolist yada toarray metotları kullanılır;
list<int> tekSayilar=(from s in sayilar where (s%2)==1 select s).toList(); dersek sonuç kümesi bellekte koleksiyon içinde saklanmış olur.
——–generic koleksyionlar ve linq
public class Ogrenci
{
public string Adi;
public DateTime DogumTarihi;
public int Numarasi;
public Ogrenci (string adi, DateTime dogumTarihi, int numarasi)
{
this.Adi = adi;
this.DogumTarihi = dogumTarihi;
this.Numarasi = numarasi;
}
}
şeklinde bir öğrenci sınıfımız olsun; sorgu değişkenlerinin IEnumerable<t> tipinde olması gerekir.en çok kullanılan ise List<T> tipidir.
daha sonra main metodu içine 4 tane list<t> koleksiyonu oluşturuyoruz.
Ogrenci o1 = new Ogrenci(“Metin”,new DateTime(1972, 2 ,2), 7823482);
Ogrenci o2 = new Ogrenci(“Ali”, new DateTime(1985, 10, 23),9288763);
Ogrenci o3 = new Ogrenci(“Feyyaz”, new DateTime(1970, 7, 30),1372426);
Ogrenci o4 = new Ogrenci(“Seba”, new DateTime(1977, 1, 13),9126343);
List<Ogrenci> ogrenciler = new List<Ogrenci>() { o1, o2, o3, o4 };
daha sonra bu generic tipten sorguulama yapmak istediğimizde ;
var sorgu=from o in ogrenciler
where o.DogumTarihi.Year <= 1975
select o.Adi +’/’+ o.Numarasi.toString();
bu sorgu ile 1975 yılından küçük olan öğrencilerin ad ve numarasını listeleyecektir.
sorgu sonucunu görmek içinde ;
foreach (var o in sorgu) {
console.writeline(o);
}
yazarız.
ÖRNEK UYGULAMA
Öncelikle visual studio ile bir windows form uygulaması açıyoruz;Northwind customers tablosu üzerinden işlem yapacağız.Ona uygun şekilde ki gibi bir kaç text,buton ve bir adet gridview atıyoruz.Forma bir adet tabControl ekleyerek basit bir tasarım oluşturuyoruz.
Şimdiki adımda ise elimizde var olan veritabanını projemize ekliyoruz.Bunun içinde projemize sağ tıklayıp add->new item->linq to sql classes şablonunu seçip bir isim verip ekliyoruz.
Projeyi eklediğimiz anda dbml uzantılı (Database Markup Language-Veritabanı İşaretleme Dili) dosya eklendiğini ve orta kısımda da veritabanı bağlantısı açtığımızda istediğimiz tabloları sürükleyip bırakabileceğimiz bir sayfa açıldığını görüyoruz.Ekranın solunda açık olan server explorer penceresinde Data Connections sekmesine sağ tıklayıp yeni bir bağlantı oluşturuyoruz.
Bu işlemi de gerçekleştirdikten sonra bağlı olan veritabanımızdan istediğimiz tabloları sürüklüyoruz alanımıza.
Eğer viewları da kullanacaksak onları da orta kısımın sağında kalan bölmeye sürükleyip işleme dahil ettirebiliriz.
Bu görsel araç sql server da seçilen tablolardan entity class denen sınıfların oluşturulmasını sağlar,tablolar sınıf kolonlar ise birer özellik olacak şekilde
otomatik olarak üretilir ve visual studio içerisnde saklanır.*designer.cs dosyası içine baktığımızda entity class ların otomatik olarak oluştuğunu görebiliriz.
Sql Server -Northwind Customers tablosu (91 Kayıt)
- Kayıt ekleme işlemleri için kullanacağımız kod blokları ;
Açıklama :
Öncelikle datacontext sınıfından bir nesne alıyoruz,aynı şekilde uygulamamızda oluşan entity class ından (Customer) bir nesne alıyoruz.Daha sonra uygulama üzerinden göndereceğimiz verileri veritabanındaki kolonlara atayıp textboxların boş olup olmamasının denetlenmesinden sonra ilk olarak tek bir kayıt göndereceğimiz için InsertOnSubmit methodunu çalıştırıyoruz ikinci olarakta memory de kaydedilen veriyi veritabanına kaydetmek için SubmitChanges() methodunu çalıştırıyoruz.
Son olarakta linq sorgusuyla toplam kayıt sayısını alıp label a yazdırıyoruz.
- Kayıtları gridview de göstermek için kullanacağımız kod blokları ;
Açıklama :
linq sorgusuyla oluşturduğumuz koleksiyonu (ki burada yeni bir nesne oluşturuyoruz) data gridview in datasource una atamamız yeterli bu konuda..
- Kayıtları Güncellemek için kullanacağımız kod blokları ;
Açıklama :
Update işlemi için formda bir kaç değişiklik yaptıktan sonra gridview ün selected rows özelliğini kullanarak seçili olan satırın sırasıyla hangi indistekinin hangi textbox a atanacağını belirtip id sini de yine hücrenin index inden yakalayıp update için atamaları yaptık.
- Silme işlemleri için kullancağımız kod blokları ;
Silme işlemi içinde yine update işlemine benzer bir kod bloğu yazdık,bir kaç fark olarak DeleteOnSubmit methodunu kullandık,tek bir kayıt sileceğimiz için.Eğer çoklu silme işlemi gerçekleştirmeye çalışsaydık DeleteAllOnSubmit methodunu kullanacaktık.
İşlemler bu kadar,veritabanı bağlantısı açma kapama gibi işlemlerde bulunmayıp datacontext isimi sınıfımız bunu otomatik olarak kendisi gerçekleştirdi.
“LinqToSql İle VeriTabanı İşlemleri” için bir yorum