Veysel Uğur KIZMAZ

LINQ to XML Select Join Sorguları

08.01.2012Okunma Sayısı: 7663Kategori: LINQ

 Bu makalemizde LINQ to XML’de Select ve Join konularını.

 
Bu konuyu bir örnek uygulama üzerinde yapalım. Uygulamamızda Kategoriler ve kategorilerin bulunduğu Urunler’imiz var. Bu bilgileri XML dosyalarında tutmaktayız. Şimdi bunlara erişimin nasıl yapılacağını inceleyelim.
 
Örnek uygulamamızı Asp.Net Web Application üzerinde gerçekleştireceğiz. Kategoriler.xml ve Urunler.xml dosyalarımızı XML klasöründe tutalım.
 
Önce XML dosyalarımıza göz atalım.
 
Kategoriler.xml
<?xmlversion ="1.0"encoding="utf-8"?>
<kategoriler>
       <kategori>
             <id>1</id>
             <ad>Icecek</ad>
       </kategori>
  <kategori>
             <id>2</id>
             <ad>Yiyecek</ad>
       </kategori>
</kategoriler>
 
Urunler.xml
<?xmlversion ="1.0"encoding="utf-8"?>
<urunler>
       <urun>
             <id>1</id>
             <ad>Kola</ad>
    <kategoriid>1</kategoriid>
       </urun>
       <urun>
             <id>2</id>
             <ad>Meyve Suyu</ad>
             <kategoriid>1</kategoriid>
       </urun>
       <urun>
             <id>3</id>
             <ad>Peynir</ad>
    <kategoriid>2</kategoriid>
       </urun>
       <urun>
             <id>4</id>
             <ad>Zeytin</ad>
    <kategoriid>2</kategoriid>
       </urun>
</urunler>
 
Öncelikle Kategorilerimizi içinde bulunduracağımız Kategori nesnemizi tanımlayalım.
 
Kategori.cs
 
   public class Kategori
    {
        public string Id { get; set; }
        public string Ad { get; set; }
    }
Kategoriler.xml dosyasına erişip bu dosyadaki tüm kategorileri alalım.
protected object Getir_Kategoriler()
        {
            XDocument xmlKategoriler = XDocument.Load(Server.MapPath("XMl/Kategoriler.xml"));
            var kategoriler = (from kategori in xmlKategoriler.Element("kategoriler").Elements("kategori")
                               select new Kategori
                               {
                                   Id = kategori.Element("id").Value,
                                   Ad = kategori.Element("ad").Value
                               }).ToList();
            return kategoriler;
        }
 
XDocument türündeki nesnemiz, XML dosyamızı temsil etmektedir.
kategoriler değişkenimizde XML’den çektiğimiz veriler bulunmaktadır.
xmlKategoriler.Element(“kategoriler”) ile XML’deki <kategoriler> nesnesi ve altındaki nesneleri alıyoruz. .Elements(“kategori”) ile, <kategoriler> nesnesi içindeki <kategori> nesneLERini alıyoruz. kategori değişkenimize, <kategoril>’in altındaki tüm <kategori>’leri alıyoruz. select new Kategori{} diyerek aldığımız tüm elemanları List<Kategori> nesnesinde tutuyoruz.
 
Bu methodumuzu Page_Load event’ında çağıracak olursak aşağıdaki ekran çıktısını alacağız.
        protected void Page_Load(object sender, EventArgs e)
        {
            GridView1.DataSource = Getir_Kategoriler();
            GridView1.DataBind();
        }
 
 
 
Şimdi aynı işlemi Urunler.xml için yapalım.
 
Urun.cs
    public class Urun
    {
        public string Id { get; set; }
        public string Ad { get; set; }
        public string Kategori { get; set; }
    }
 
        protected object Getir_Urunler()
        {
            XDocument xmlUrunler = XDocument.Load(Server.MapPath("XML/Urunler.xml"));
            var urunler = (from urun in xmlUrunler.Element("urunler").Elements("urun")
                           select new Urun
                           {
                               Id = urun.Element("id").Value,
                               Ad = urun.Element("ad").Value,
                               Kategori = urun.Element("kategoriid").Value
                           }).ToList();
            return urunler;
        }
 
Bu methodumuzu Page_Load event’ında çağıracak olursak aşağıdaki ekran çıktısını alacağız.
        protected void Page_Load(object sender, EventArgs e)
        {
            GridView1.DataSource = Getir_Urunler();
            GridView1.DataBind();
        }
 
 
Kategoriler XML’imizde kategorinin Id’si ile Urunler XML’imizde ürünün kategoriid’sinin bağlı olduğunu düşünüp bir bağlantı kurup ekranda “ürün id, ürün adı, kategori adı”’nı ekranda gösterelim.
 
        protected object Getir_Urunler2()
        {
            XDocument xmlUrunler = XDocument.Load(Server.MapPath("XML/Urunler.xml"));
            XDocument xmlKategoriler = XDocument.Load(Server.MapPath("XMl/Kategoriler.xml"));
            var urunler = (from urun in xmlUrunler.Element("urunler").Elements("urun")
                           join kategori in xmlKategoriler.Element("kategoriler").Elements("kategori")
                           on urun.Element("kategoriid").Value equals kategori.Element("id").Value
                           select new Urun
                           {
                               Id = urun.Element("id").Value,
                               Ad = urun.Element("ad").Value,
                               Kategori = kategori.Element("ad").Value
                           }).ToList();
            return urunler;
        }
 
xmlUrunler değişkenimizde Urunler.xml’i, xmlKategoriler değişkenimizde Kategoriler xml’imizi tutuyoruz.
Join yaptığımız kodu şu şekilde açıklayabiliriz : xmlUrunler’in <urunler> elemanının altındaki <urun> elemanları ile xmlKategoriler’in <kategoriler> elemanının altındaki <kategori> elemanları, <urun>’un <kategoriid>’si ile <kategori>’nin <id>’sinin aynı olacağını belirterek birleştiriyoruz ve sonuçta oluşan veri kümemizi Urun nesnesinde tanımlıyoruz. Bize urunler değişkeninde List<Urun> türünden bir değer dönmektedir.
 
Bu methodumuzu Page_Load event’ında çağıracak olursak aşağıdaki ekran çıktısını alacağız.
        protected void Page_Load(object sender, EventArgs e)
        {
            GridView1.DataSource = Getir_Urunler2();
            GridView1.DataBind();
        }
 
 
Son olarak bu örneğimizdeki iki XML dosyasını tek XML dosyası haline getirip son örneğimizi ona göre düzenleyelim.
 
UrunKategori.xml
<?xmlversion="1.0"encoding="utf-8"?>
<bakkal>
  <urunler>
    <urun>
      <id>1</id>
      <ad>Kola</ad>
      <kategoriid>1</kategoriid>
    </urun>
    <urun>
      <id>2</id>
      <ad>Meyve Suyu</ad>
      <kategoriid>1</kategoriid>
    </urun>
    <urun>
      <id>3</id>
      <ad>Peynir</ad>
      <kategoriid>2</kategoriid>
    </urun>
    <urun>
      <id>4</id>
      <ad>Zeytin</ad>
      <kategoriid>2</kategoriid>
    </urun>
    <urun>
      <id>5</id>
      <ad>zeytin yağı</ad>
      <kategoriid>2</kategoriid>
    </urun>
    <urun>
      <id>6</id>
      <ad>Tereyağı</ad>
      <kategoriid>2</kategoriid>
    </urun>
    <urun>
      <id>7</id>
      <ad>ayçiçek yağı</ad>
      <kategoriid>2</kategoriid>
    </urun>
    <urun>
      <id>8</id>
      <ad>Fındık Yağı</ad>
      <kategoriid>2</kategoriid>
    </urun>
  </urunler>
  <kategoriler>
    <kategori>
      <id>1</id>
      <ad>Icecek</ad>
    </kategori>
    <kategori>
      <id>2</id>
      <ad>Yiyecek</ad>
    </kategori>
  </kategoriler>
</bakkal>
 
<urunler> ve <kategoriler> nesnelerimizi <bakkal> nesnemizin altında tanımlayalım.
 
        protected object Getir_UrunKategori()
        {
            XDocument xmlUrunler = XDocument.Load(Server.MapPath("XML/UrunKategori.xml"));

            var urunler = (from urun in xmlUrunler.Element("bakkal").Element("urunler").Elements("urun")
                           join kategori in xmlUrunler.Element("bakkal").Element("kategoriler").Elements("kategori")
                           on urun.Element("kategoriid").Value equals kategori.Element("id").Value
                           select new Urun
                           {
                               Id = urun.Element("id").Value,
                               Ad = urun.Element("ad").Value,
                               Kategori = kategori.Element("ad").Value
                           }).ToList();
            return urunler;
        }
 
Burada önce xmlUrunler’in altındaki bakkal elemanına erişiyoruz. Sonrasında urunler ve kategoriler elemanlarına erişiyoruz.
 
Çalıştırdığımızda ekran çıktısı aşağıdaki gibi olacaktır.
 
 
 
Veysel Uğur KIZMAZ
Bilgisayar Mühendisi
veysel@ugurkizmaz.com