9 Eylül 2008 Salı

LINQ to SQL

Veritabanını sorgulamak için linq to sql kullanacağız.
Herhangi bir veritabanına ait bir tabloyu sorgulamak için projenizin içerisine Add->New Item->LINQ To SQL Classes eklemeniz gerekiyor. Bu bize projemizde .dbml uzantılı bir sayfa daha oluşmasını sağlıyor. Sonra sorgulamak istediğimiz tabloları Server Explorer dan bu sayfa üzerine sürükleyip bırakmalıyız. Biraz sonraki örneklerde Northwind veritabanı ve içinde calisanlar ve siparisler veritabanı kullanılmıştır.
Şimdi öncelikle kod kısmında yeni oluşturduğumuz sayfayı kullanabilmek için bir kopyasını alalım
NorthwindDataContext db = new NorthwindDataContext();

Ex1: Calisanlar tablosundan unvanı Mr. olanları çekelim. Bunu ilk önce bildiğimiz yöntemle yapalım aradaki fark anlaşılsın diye.
string baglanti = "Server=.; Database=Northwind; Integrated Security=SSPI;";
SqlConnection con = new SqlConnection(baglanti);
DataTable calisanlar = new DataTable();
SqlDataAdapter da = new SqlDataAdapter("Select * from calisanlar where unvan='Mr.'", con);
da.Fill(calisanlar);
dataGridView1.DataSource = calisanlar;
Şimdi de eşdeğer LINQ sorgusu
var calisanlar = from n in db.Calisanlars
where n.Unvan == "Mr."
select n;
dataGridView1.DataSource = calisanlar;

Ex2: Calisanlar ve siparisler tablosunu birleştirerek calisanID, adSoyad, ulke, unvan ve nakliyeUcretleri alanlarından ilk 10 tanesini alan LINQ
var calisanlar = (from c in db.Calisanlars
from s in db.Siparislers
where c.CalisanID == s.CalisanID
select new { s.CalisanID, adSoyad = c.Ad + " " + c.Soyad, c.Ulke, c.Unvan, s.NakliyeUcreti }).Take(10);

Ex3: Veri tabanına yeni bir kayıt ekleyelim.
Calisanlar calisan = new Calisanlar();
calisan.Ad = "Ahmet";
calisan.Soyad = "Kısa";
calisan.Unvan = "Mr.";
calisan.DogumTarihi = DateTime.Now;
db.Calisanlars.InsertOnSubmit(calisan);
db.SubmitChanges(); //Veri tabanına değişikleri kaydediyor. Adapter nesnesinin Update metodu gibi.

Ex4: Soyadımı yanlış yazmışım onu UPDATE edelim.
Calisanlar calisan = db.Calisanlars.First(c => c.Ad == "Ahmet");
calisan.Soyad = "UZUN";
db.SubmitChanges();

Ex5: Birden çok kayıt olursa UPDATE etmek istediğimiz. Calisanlar tablosunda bolge alanları boş bırakılmış en azından o alanlara boş yazalım.
var calisanlar = from c in db.Calisanlars
select c;
foreach (var calisan in calisanlar)
{
calisan.Bolge = "yok";
}
db.SubmitChanges();

Ex6: Yabancıların yanında benim adım iyi durmadı onu SİLelim.
var silinecek = from c in db.Calisanlars
where c.Ad == "Ahmet" && c.Soyad == "UZUN"
select c;
db.Calisanlars.DeleteAllOnSubmit(silinecek);
db.SubmitChanges();

Her türlü örnekten bir tane yapmaya çalıştım. Fazlasını herkes kendisi yapsın.
İşte size baka baka ömrünüzün yetmeyeceği LINQ örnekleri (37Kb) Microsoft çalışanı bir abimizin bloğundan almıştım ismini hatırlayamadım :(.

5 Eylül 2008 Cuma

LINQ

LINQ (Language Integrated Query) : .net 3.0 ile gelen bir yenilik. Veri tabanında select işlemleri yapmayı sevenler için süper bir özellik. Normalde yazmamız çok zaman alacak işlemleri LINQ sayesinde çok kısa bir zamanda yapabiliyoruz. Değişik çeşitleri var LINQ, LINQ to SQL, LINQ to XML vb...
Ben şimdi genel anlamda proje içinde dizilerde yapacağımız bazı örnek sorgular yapacağım başlangıç olsun diye sizinde dikkatinizi çekecektir ne kadar kolay olduğu. Belki de buradan görüp de öğrenmeye başlayanlar olabilir diye de bir başlangıç yapayım dedim ;).
Öncelikle şunu belirteyim var değişkeni. Javascriptte bulunan var değişkeni burada da aynı mantıkla kullanılıyor içinde her türlü veri tutabilen bir nevi object nesnesi tarzında bir değişken.

int[] sayilar={3,2,5,6,1,2,8,9,0};
var bulunan = from n in sayilar
where n <= 6 orderby n
select n;
6 dan küçük sayıları bularak bunları küçükten büyüğe sıralayan kodumuz bu kadar. Tamamen anlaşılır bir şekilde ve select, from, where kalıbına çok benzer.

string[] names = { "aHmet", "uZuN", "IsTanBul", "bUrSA" ,"AHmet"};
var withLowerUpperLetters = (from n in names
orderby n
select new { Lower = n.ToLower(), Upper = n.ToUpper() }).Distinct();
string sonuc = "";
foreach (var v in withLowerUpperLetters)
{
sonuc += v.Lower + " ";
}
sonuc += "\n";
foreach (var v in withLowerUpperLetters)
{
sonuc += v.Upper + " ";
}
MessageBox.Show(sonuc);
Diziyle verilen isimleri alıp onları büyük ve küçük harflere çeviren LINQ ve devamı. Aynı olan isimleri ikinciye almaz.

son örnek olarak;
string sonuc = "";
int[] sayilar = { 0, 2, 3, 7, 8, 9, 6, 4, 1 };
var numberGroups = from n in sayilar
group n by n % 5 into g
select new { g.Key, numbers = g };
foreach (var g in numberGroups)
{
sonuc += g.Key + " kalanı verenler ";
foreach (var n in g.numbers)
{
sonuc += n+" ";
}
sonuc += "\n";
}
MessageBox.Show(sonuc);
sayilar dizisindeki elemanları 5'e bölümünden kalan sayılarına göre gruplayan LINQ.
Şimdilik bu kadar. LINQ to SQL de görüşmek üzere. Herkese kolay gelsin.