Ana Sayfa  Forum  Ekibimiz  Manifesto  Röportajlar  İletişim   RSS   
 
 .NET Micro Framework
 Ado.Net
 Algoritmalar
 ASP 3.0
 Asp.Net
 C/C++
 Cloud Computing
 Dynamics CRM
 Expression Studio
 Genel
 Java
 Kod Parçaları
 Mobil Programlama
 MySQL
 Office System
 Silverlight
 SQL Server
 Visual Basic .Net
 Visual C# .Net
 Visual Studio ve Araçlar
 WPF & XAML
 XML Web Servisleri
 Yazılım Güvenliği
 Yazılım Mühendisliği
  Ana Sayfa / Makaleler / Asp.Net / LinQ ile Web Uygulamaları-1
Bookmark and Share  
Yusuf KARATOPRAK
yusufkaratoprak@yahoo.com

Bu yazımızda LinQ teknolojisinin doguşu nasıl kullanıldığından  bahsetmeyeceğim. Yazım daha çok bir web sitesinde effektif bir linq entegrasyonu sunmak. Şöyleki incelediğim makalelerde şunu fark ettim. Veri işleme  kod geliştiricilerin en çok ilgilendikleri konulardan biridir. LinQ da bize bu konuda yardım etmektedir. LinQ’nun açılımını söylemeden geçmek olmaz. LINQ ‘nun açılımı   Language Integrated Query yani Dil ile bütünleştirilmiş sorgu kelimelerinin kısaltılmasıyla oluşturulmuştur. Query kelimesi Sql de kod geliştiren yada herhangi bir dil ile veritabanı ulaşımlı kod  yazan geliştiricilerin vaz geçilmez kelime dağarcığının en üst sıradaki parçasıdır.Dil ile olan bağlantısını düşünürsek : Bizler projemizde yazdığımız değerleri değişkenlerde saklarız ileri uygulama geliştiriciler bilhassa bu değişkenleri Generics Collections dan seçer. Şimdi Bazı makalelerede şunu okudum. Linq bu değişkenlerin içinde sorgu yazmamıza olanak sağlar demişler. Şöyle söyleyeyim. Sorgu için linq ya gerek yoktur bu işlemleri linq sorguları kullanmadan yapabilirsiniz. Ama bunu yapmak için ya internette yoğun  kod araması yapmanız yada code gurusu olmanız gerekecektir. Bu sıska linq antisempatizanlarının son çırpınışlarıdır.  Böyle esnek bir teknoloji varken niçin bu kadar gerilim yaratalım ki? Ben her zaman şunun savunucusuyum  ağır algoritmalar bizim için iki kere vakit kayıbır. Neden mi birincisi yazarken vakit gider . İkincisi 6 ay sonra baktığınızda o vakit kadar da vakit harcarsınız.

Şimdi konumuza dönelim ve linq teknolojisinde bana hiçde esnek gelmeyen bir uygulama gerçekleştirelim sonrasında bu uygulamayı Sql desteği ile nasıl esnek hale getirdiğimizi görelim. Bunun için öncelik ile bir adet class oluşturalım. Senaryomuzda bir firmanın çalışanları ve bu çalışanlara ait bilgiler var.

  class Elemanlar

    {

        public string Ad { get; set; }

        public string SoyAd { get; set; }

        public string Email { get; set; }

        public int Maas { get; set; }

        public int Yas { get; set; }

    }

Yukarıdaki sınıf propertyleri tanımlanmıştır.  Şimdi PageLoad kısmında bir adet List sınıfı ekleyelim. Elementlerinin tipini Elemanlar classı diyelim.

List<Product> products_ = new List<Product>();

Şimdi bu kodu şöyle düzenleyelim. Elimizdeki verileri List sınıfına girelim. Unutmayalımki elimizdeki List sınıfı generic collection sınıfına dahildir. Element tipi ise Bizim sınıfımız olan Elemanlar classıdır. O zaman ben bu sınıfı her defasında yaratarak Elemanlar sınıfının içindeki propertyleri belli olan değişkenler içinde verilerimi saklayabilirim. Bir Object yarat ve her defasında onu generate et ve kullan güzel değil mi!

List<Elemanlar> elemanlar = new List<Elemanlar>()

            {

                new Elemanlar{ Ad="Yusuf", SoyAd="Karatoprak", Email="yusufkaratoprak@developermania.net", Maas=1200, Yas=25 },

                new Elemanlar{ Ad="İbrahim", SoyAd="Ersoy", Email="ibrahimersoy@developermania.net", Maas=1700, Yas=26},

                new Elemanlar{ Ad="Batuhan", SoyAd="Tosun", Email="batuhantosun@developermania.net", Maas=1700, Yas= 26},

                new Elemanlar{ Ad="Volkan", SoyAd="Atasever", Email="volkanatasever@developermania.net", Maas=2000, Yas= 25}

            };

Şimdi gelelim Linq kısmına yazımızın en başında generic claslar içinde search , select  ve benzeri işlemler yapmamızda linq ‘ya ihtiyaç olmadığını söylemiştim. Ama Linq tıpkı sql sorgusu yazar gibi kod içerinde sorgu yazmamızı veri ile ingilizce konuşmamıza olanak veriyor demiştim. Şimdi bu heyecanı beraber yaşayalım.

LinQ ile gelen var değişken bildirimi kullanım olarak javascript ile aynı, Query sonucunda çıkan tablo verilerini  tutar. Aşagıdaki query de ilk başta select in sonda olması direksiyonu sağda kullanma etkis yaratabilir. Fakat bir süre sonra alışıyorsunuz. Elemanlar listesinden query ile bir liste gelir bu liste  from gelenliste in tümliste    sotgusu ile anlaşılmaktadır. Select new {} ise sorgu kriterini belirtmektedir. SQL deki “ select x,y,z from tablo “  benzeridir.

var results = from eleman in elemanlar

                   where eleman.Maas > 1500 && eleman.Yas > 25

                   select new { eleman.Ad, eleman.SoyAd };

foreach (var result in results)

{

 Response.Write("Ad: " + result.Ad + " SoyAd: " + result.SoyAd + "<br>");

}

Sonuç :    Ad: İbrahim SoyAd: Ersoy
                Ad: Batuhan SoyAd: Tosun

Yukarıdaki  uygulamaların benzeri internette mevcuttur. Bu tip uygulamaları görünce ben şunu sorarım neden listeyi hep code içerisinde dolduruyoruz şimdi şöyle yapalım. Liste veritabanından dolsun. Ben LinQ yu şöyle kullanmayı hayal ediyorum. Uzun bir veri aralığında çalışalım. Br onlinealışveriş firmasının ürün  kayıtları olsun. Ben sadece 2008-2009 yılları arasında basit bir sql kodu ile çekerim. Elimdeki veriyi Product.cs class içinde list içine doldururum. Querylerimi linq vasıtası ile code içinde yazarım. İşte bundan sonraki yazacağım kodlar tamamen bu olacak! 

LinQ :

1)      Sürekli stored procedure yazma külfetinden beni kurtarıyor. Tüm Queryler bir sınıf içinde toplanabilir.

2)      XML verileri içinde  query yazabilirim. Bu çok iyi.

3)      SQL server arasında mekik dokuma minimuna indirildi.

Şimdi bir adet framework ve linq işlemleri için bir adet class ekleyelim.

 

1)      Verilerin çekildiği data access layer

2)       Verilerin listeye atandığı Product.cs

Veriler (1) dal metodu ile çekildi. Şimdi bu verileri list içine almakta…

public class Product

    {

public string Marka { get; set; }

        public string Model { get; set; }

        public int Fiyat { get; set; }

        public string Resim { get; set; }

        public DateTime Tarih { get; set; }

 public static List<Product> GetProductList()

        {

List<Product> products_ = new List<Product>();

GetData prd = new GetData();

foreach (DataRow dr in prd.GetProductData().Tables[0].Rows)

products_.Add(new Product{

Fiyat = int.Parse(dr["fiyat"].ToString()),

Marka = dr["marka"].ToString(),

Model = dr["model"].ToString(),

Resim = dr["resim"].ToString(),

Tarih = Convert.ToDateTime(dr["tarih"].ToString())

});

return products_;  }

  (2) ile  veriler list içinde toplandı. Şimdi,  Default.cs içinde verileri linq ile sorgulamaya geldi. Şöyle bir sayfa yapalım:


Sayfamızda bir adet gridview 4 adet textbox ve sorgulama işlemi çin bir adetde button bulunmaktadır. Sayfa Load olduğunda veriler Grid içinde görünecektir. Arama kriterleri istenildiği kombinasyonda girlecektir. Her şekilde ziyaretçiye istenen bilgiler sunulacaktır.

protected void ButtonSearch_Click(object sender, EventArgs e)

        {

            FillGrid();

        }

Button Click içinde FillGrid() metodu altında yapılır.

List<Product> products = Product.GetProductList();

var results = from p in products select p;

if ((TextBox1.Text != "" && TextBox2.Text != "" && TextBox3.Text != "" && TextBox4.Text != ""))

result = from p in products

where p.Fiyat > Convert.ToInt32(TextBox1.Text) &&

p.Fiyat < Convert.ToInt32(TextBox2.Text) &&      

p.Model == TextBox4.Text &&

p.Marka==TextBox3.Text           

select p;

Yukarıdaki kod sql koduna oldukça benzemektedir. Classımın adı Product.cs idi. Bu Class altındaki GetProductList() fonksiyonu List tipinde değer döndermektedir. O zaman List tipinde bir değişkende Default.cs içinde tanımlayalım ve elementlerinin tipinide yine Product yapalım. Product.GetProductList(); fonksiyonu ile dönen değer list tipindedir. Linq ile products listi içinde sorgu yazalım. Veritabanından bir veri kümesi dönderiyoruz. Bunu liste atıyoruz ve bu listin içinden bir list veyadataset tipinde bir değer kümeleri çıkarıyoruz. İstersek sonucu dolaysız olarak Gridviewda atardık.Ama gelin linq keyfini biraz daha sürelim. Daha önce bahsettiğimiz gibi, var değişkeni linq ile C# içine girdi. Bu sorgudan dönen değerler results altında toplandı. Şimdi bunu tarayıcıda görelim. Sayfa ilk açıldığında verilerin hepsi gelecektir.


Şimdi sorgu kirerlerini çalıştıralım.

FillGrid() alt programında neler oluyor.Bizim için önemli olan nokta şudur. Linq sorgularını kod içinde textboxlara girilen değerlere göre nasıl sorgulandığıdır.

Bu kriterleri ve sonuçları  adım adım görelim:



Şimdi başka bir kriter kullanalım.


Yukarıdaki örnekler sql queryleri ile çok benzemektedir. Where koşuluna dikkat ediniz. Textbox3’e yazılan arama kriteri Liste verileri altında marka elemerntinde taranmaktadır.Sonuç Var değişkenine dönderilir.Kodların hepsine bakalım:

void FillGrid()

{

List<Product> products = Product.GetProductList();

int fiyat1 = (TextBox1.Text != "") ? Convert.ToInt32(TextBox1.Text) : 0;

int fiyat2 = (TextBox2.Text != "") ? Convert.ToInt32(TextBox2.Text) : 0;

string marka = (TextBox3.Text != "") ? TextBox3.Text : "";

string model = (TextBox4.Text != "") ? TextBox4.Text : "";

var results = from p in products select p;

if ((TextBox1.Text != "" && TextBox2.Text != "" && marka != "" && model != ""))

{results = from p in products where p.Fiyat > fiyat1 && p.Fiyat < fiyat2 && p.Model == model && p.Marka == marka select p;

}

else

{

if ((TextBox1.Text != "" && TextBox2.Text != "") && (TextBox3.Text == "" && TextBox4.Text == ""))

results = from p in products where p.Fiyat > fiyat1 && p.Fiyat < fiyat2 select p;

 else if ((TextBox1.Text == "" && TextBox2.Text == "") && (TextBox3.Text != "" && TextBox4.Text != ""))

results = from p in products where p.Marka == marka && p.Model == model select p;

else if ((TextBox1.Text != "" && TextBox2.Text != "" && TextBox3.Text != "" && TextBox4.Text == ""))

 results = from p in products where p.Fiyat > fiyat1 && p.Fiyat < fiyat2 && p.Marka.Contains(marka)select p;

 else if ((TextBox1.Text != "" && TextBox2.Text != "" && TextBox3.Text == "" && TextBox4.Text != ""))

results = from p in products where p.Fiyat > fiyat1 && p.Fiyat < fiyat2 && p.Model.Contains(marka) select p;

else if ((TextBox1.Text == "" && TextBox2.Text == "" && TextBox3.Text != "" && TextBox4.Text == ""))

results = from p in products where p.Marka.Contains(marka) select p;

else if ((TextBox1.Text == "" && TextBox2.Text == "" && TextBox3.Text == "" && TextBox4.Text != ""))

results = from p in products where p.Model.Contains(model)select p;

else

results = from p in products select p;

}

 GridView1.DataSource = results.AsEnumerable();

 GridView1.DataBind();

 }

Girilen kriterler list içinde aranmakta sonuç setleri var tipindeki results değişkenine atanmaktadır. Results.AsEnumarable ile sonuçlar GridView içinde gösterilmektedir.

Sonuç olarak bu yazıda linq ile bir weppage içinde efektif kod yazmayı gördük.Nedemek  Linq ile efektif kod yazmak? sql de daha az storedprocedure yazarak daha az zaman harcadık. Sorgularımızı sqlden basit bir stored procedure ile dönderdiğimiz sonuç setleri üzerinde yazdık. Böylelikle daha önceden kalan "sql'e git storedprocedure bul, anlamaya çalış tekrar koda dön" mantığından kurtulmuş olduk. Böylelikle baglantı ve code içinde storedprocedure ismini tanıtmak ve ağır DAL 'lar yazmadık. Herşey açık ve net ben ne yaptım burda dediğimizde linq bize bunu gösteriyor.


Yusuf KARATOPRAK
Yazarın Hakkında Bilgi İçin Tıklayınız !
Yorum yazabilmek için üye girişi yapmalısınız.
Üye girişi için tıklayın. Üye değilseniz Üyel Ol linkine tıklayarak hemen üye olabilirsiniz.

 

 
  İletişim RSS    
Manifesto Forum    
Ekibimiz      
DeveloperMania.Net INETA MEA Üyesidir.
 

 

Copyright © 2008-2010 DeveloperMania.Net Yazılım