ASP.NET 4.0 Yenilikleri – QueryExtender


Bu makalemizde daha önce yayınladığımız ASP.NET 4.0 Yenilikleri makalesine devam ediyor ve başka bir yenilik olan QueryExtender‘ı incelemeye çalışıyoruz.

Elbetteki yaşam çalışmak ve para kazanmakla sınırlı değil! Müziğe de zaman ayırmalı! Barış Abi’nin “Anlıyorsun değil mi?” şarkısıyla başlayalım istedim.🙂

QueryExtender

Benim Sorgu Genişletici ya da Sorgulayıcı olarak Türkçeleştirdiğim bu nesne System.Web.UI.WebControls isim uzayında yer alıyor. Assembly’si ise System.Web.Extensions.dll’dir. ‘Control’ nesnesinden türetilen bu nesne, veri tabanındaki bir bilgiyi kolayca filtrelememizi sağlıyor. Söz dizimi aşağıdaki gibidir:

<asp:QueryExtender />

Linq ve Entity veri kaynakları (DataSource) üzerinde de filtrleme yapabilen QueryExtender, 8 farklı filtreleme seçeneğine sahiptir:

ControlFilterExpression, System.Web.DynamicData kütüphanesinde yer alır ve DataSourceExpression sınıfından türemiştir. Veri kaynakları birbirine bağlanmış (dinamik veriler için) ListView ve GridView kontrollerinin üzerinde süzme işlemi yapılmasını sağlar. Kaynak kontrol’de yapılan süzme işlemi, hedef kontrol için de geçerli olur ve hatta kaynaktaki süzülen kayıtla ilgili satıra seçilm yapılmasını sağlayabiliriz.

Örnek kullanım:

<asp:QueryExtender ID="QueryExtenderID"
	TargetControlID="TargetDataSourceID" runat="server">
	<asp:ControlFilterExpression ControlID="SourceGridViewID" /> 
</asp:QueryExtender>  

TargetControlID, veri kaynağını (Data Source) tutuyor.

CustomExpression, LINQ sorguları üzerinde süzme (filtreleme) işlemi yapan Expression’dır. System.Web.Extensions kütüphanesinde yer alır ve ParameterDataSourceExpression sınıfından türetilmiştir.

Örnek kullanım:

    <asp:LinqDataSource ID="LinqDataSource1" runat="server" 
        ContextTypeName="AdventureWorksDataContext" EntityTypeName="" 
        TableName="Products">
    </asp:LinqDataSource>

    <asp:QueryExtender ID="QueryExtender1" runat="server" TargetControlID=
"LinqDataSource1">
        <asp:CustomExpression OnQuerying="FilterProducts"></asp:CustomExpression>
    </asp:QueryExtender>

    <asp:GridView ID="GridView1" runat="server"  
        DataSourceID="LinqDataSource1"   
        DataKeyNames="ProductID"  AllowPaging="True">
    </asp:GridView>

Bir LinqDataSource, bir QueryExtender, bir de GridView ekledik. GridView’in DataSourceID’sini LinqDataSource olarak gösterdik ve QueryExtender‘in OnQuerying özelliğini ürünler üzerinde süzme yapması için ayarladık.

Şimdi de C# kısmına geçip şu kodları inceleyelim:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.Expressions;
using System.Linq;

public partial class _Default : System.Web.UI.Page
{
protected void FilterProducts(object sender, CustomExpressionEventArgs e)
{
e.Query = from p in e.Query.Cast<Product>()
where p.ListPrice >= 3500
select p;

}
}

Hemen dikkatimizi çeken FilterProducts olmalıdır çünkü OnQuerying özelliğine atadığımız değer için bu kodları yazdık.Ürün fitatı 3500’ün üzerinde olan ürünler listenecektir. ‘e.Query‘ ile ulaşılan sorguyu QueryExtender sağlamaktadır.

DynamicFilterExpression, ASP.NET Dynamic Data web sitelerinde QueryExtender üzerinden süzme işlemi yapmak için kullanılır. System.Web.DynamicData.dll kütüphanesinde bulunan ve DataSourceExpression sınıfından türetilmiştir.

Örnek kullanımı:

<asp:QueryExtender ID="QueryExtender1" 
     TargetControlID="GridDataSource" runat="server">
    <asp:DynamicFilterExpression ControlID="CategoryFilterID" />
</asp:QueryExtender>

MethodExpression, Bir LINQ sorgusu üzerinden arama işlemi yapmak için kullanılır.System.Web.UI.WebControls.Expressions isim uzayında bulunur, System.Web.Extensions.dll kütüphanesinde yer alır ve ParameterDataSourceExpression sınıfından türetilmiştir.

Kullanacağı LINQ sorgusu şu kurallara uymak durumundadır:

İlk parametre IQueryable<T> ya da IEnumerable<T> türünden olmalıdır. Static olan bu metod birden fazla parametre alabilmektedir.

Geri döndürülen (return) değer IQueryable<T> ya da IEnumerable<T> türünden farklı bir türe dönüştürülerek gönderilemez.

Şimdi ASPX ve C# kodlarımıza bakalım:

 <asp:LinqDataSource ID="LinqDataSource1" runat="server" 
        ContextTypeName="AdventureworksDataContext" EntityTypeName="" 
        TableName="Products">
    </asp:LinqDataSource>
    
    <asp:QueryExtender ID="QueryExtender2" runat="server" 
        TargetControlID="LinqDataSource1">
      <asp:MethodExpression MethodName="FilterStandardPrice" >
      </asp:MethodExpression>
    </asp:QueryExtender>

    <asp:GridView ID="GridView1" runat="server" 
        DataSourceID="LinqDataSource1" 
        DataKeyNames="ProductID" 
    </asp:GridView>

QueryExtender‘ımızın içindeki MethodName FilterStandartPrice olarak ayarlanmış. Şimdi gelelim metodumuza:

        public static IQueryable<Product> 
        FilterStandardPrice(IQueryable<Product> query)
	 	 {
        return from p in query
                  where p.ListPrice >= 400
                  select p;
        }

FilterStandartPrice metodumuz IQueryable türünden bir parametre alıyor ve geri döndürüyor (return). Ürün fiyatı 400’e eşit ve 400’ün üstünde olan ürünler listelenecektir.

OrderByExpression, adından da anlaşılabileceği üzere sıralama işini yapar. SQL’deki order by’a eşdeğer olan bu Expression, System.Web.UI.WebControls.Expressions isim uzayında, System.Web.Extensions.dll kütüphanesinde yer alır ve DataSourceExpression sınıfından türetilmiştir. Tıpki SQL’de olduğu gibi artan veya azalan sıralama yapabilir. Sözü fazla uzatıp konuyu boğmadan örneğimizi inceleyelim:

 Ara<asp:TextBox ID="txtAra" runat="server" />

    <asp:Button ID="btnAra" runat="server" Text="Ara"  /> 

  <asp:LinqDataSource ID="LinqDataSource1"  
      ContextTypeName="AdventureWorksDataContext"  
      TableName="Products" runat="server"> 
  </asp:LinqDataSource>

  <asp:QueryExtender ID="QueryExtender1" runat="server" TargetControlID=
"LinqDataSource1">
    <asp:SearchExpression SearchType="StartsWith" DataFields="Name" >
      <asp:ControlParameter ControlID="txtAra" />
    </asp:SearchExpression>
    <asp:OrderByExpression DataField="ListPrice" 
        Direction="Descending">
      <asp:ThenBy DataField="ProductID" Direction="Ascending"/>
    </asp:OrderByExpression>
  </asp:QueryExtender>

  <asp:GridView ID="GridView1" runat="server"  
      DataSourceID="LinqDataSource1" AllowPaging="True" >
  </asp:GridView>

<asp:SearchExpression SearchType=”StartsWith” DataFields=”Name” >

Satırında SeacrhType=”StartsWith” olarak belirtilen özellik,”girilen değerle başlayanlar listelensin” şeklinde yorumlanabilir.

<asp:OrderByExpression DataField=”ListPrice”
Direction=”Descending”>

Satırında DataField özelliğiyle belirtilen alan, sıralanacak alanı belirliyor. Direction ise artan mı azalan mı olacağına karar veriyor.

PropertyExpression, SQL’den alışık olduğumuz WHERE parametrelerinin taşıyıcısıdır. System.Web.UI.WebControls.Expressions isim uzayında yer alır, System.Web.Extensions.dll kütüphanesinde tutulur ve ParameterDataSourceExpression sınıfından türetilmiştir. Daha çok karşılaştırma \ doğrulama işlemleriyle açıklanan bu Expression’ını tanımaya çalışalım:

LINQ sorgularını desteklemekle birlikte, sorgu sonucu bir GridView’da görüntülenir. InvalidOperationException isimli SystemException‘dan türemiş bir hata yakalayıcısı vardır. DataField‘in null olması durumuna karşı yaratılmıştır. Bool olan değerler direk CheckBox’lar tarafında görüntülenir.

  Daha fazlasını yap! <asp:CheckBox ID="MakeCheckBox" runat="server" />

  <asp:LinqDataSource ID="LinqDataSource1"  
      ContextTypeName="FilterDemo.AdventureWorksDataContext"  
      TableName="Products" runat="server"> 
  </asp:LinqDataSource>

  <asp:QueryExtender ID="QueryExtender1" runat="server"    
      TargetControlID="LinqDataSource1">
    <asp:PropertyExpression>
      <asp:ControlParameter ControlID="MakeCheckBox" Name="MakeFlag" />
    </asp:PropertyExpression>
  </asp:QueryExtender>

  <asp:GridView ID="GridView1" runat="server"  
      DataSourceID="LinqDataSource1" AllowPaging="True"    
      DataKeyNames="ProductID>
  </asp:GridView>

ControlParameter’in özelliği olan ControlID, MakeCheckBox isimli CheckBox’ın seçilip seçilmemesi durumuna göre süzme işlemi gerçekleştiriyor.

RangeExpression, bir değerin olup olmadığını, karşılaştırılan değerden büyük olup olmadığını, karşılaştırılan değerlerin arasında olup olmadığı gibi SQL’den hatırladığımız 5>10, between gibi

özelliklerin taşıyısıcıdır. System.Web.UI.WebControls.Expressions isim uzayında, System.Web.Extensions.dll kütüphanesinde tutulur ve ParameterDataSourceExpression sınıfından türetilmiştir.

InvalidOperationException isimli SystemException‘dan türemiş bir hata yakalayıcısı vardır. DataField’in null olması durumuna karşı yaratılmıştır.

    <asp:TextBox ID="txtNereden" runat="server"></asp:TextBox>
    <asp:TextBox ID="txtNereye" runat="server"></asp:TextBox>
    <asp:Button ID="btn1" runat="server" Text="Button" />

    <asp:LinqDataSource ID="LinqDataSource1" 
        ContextTypeName=" FilterDemo.AdventureworksDataContext"  
        runat="server" TableName="Products">
    </asp:LinqDataSource>

    <asp:QueryExtender ID="QueryExtender1" runat="server"  
        TargetControlID="LinqDataSource1">

    <asp:RangeExpression DataField="ListPrice"  
        MinType="Inclusive" MaxType="Exclusive">
    <asp:ControlParameter ControlID="txtNereden" />
    <asp:ControlParameter ControlID="txtNereye" />
    </asp:RangeExpression>
</asp:QueryExtender>

<asp:GridView ID="GridView1" runat="server"    
    DataSourceID="LinqDataSource1" AllowPaging="True" >
</asp:GridView>

Nereden ve Nereye isimli textBox’ları parametre olarak alan RangeExpression, Maksimum değer dışında (Exlusive) ListPrice üzerinde bir karşılaştırma yapar. İki değer arasındaki farklar ekrana getirilir.

SearchExpression, yapılacak aramanın tipini belirleme işleminde kullanılır. Daha önce OrderByExpression‘da değindiğimiz bu Expression’ı biraz daha yakından tanımaya çalışalım. System.Web.UI.WebControls.Expressions isim uzayındadır. System.Web.Extensions.dll kütüphanesinde tutulur ve ParameterDataSourceExpression sınıfından türetilmiştir. DataField özelliğinin null olma durumuna karşı InvalidOperationException hata yakalayıcısı vardır. Diğer Expression’lardan farklı olarak yalnızca C#’da çalışmaktadır. VB.NET desteği yoktur.

SearchExpression‘ın üç farklı SearchType‘ı vardır:

  1. StartsWith, OrderByExpression‘da açıkladığımız gibi; girilen değerle başlayan verileri listeler.
  2. Contains, girilen değeri içeren verileri listeler.
  3. Ends with ise girilen değerle biten verileri listeler.

Şimdi kodlarına göz atalım ve daha iyi anlamaya çalışalım:

 Ara: <asp:TextBox ID="txtAra" runat="server" />
  <div>
  <asp:Button ID="Button1" runat="server" Text="Search"  />
  </div>

  <asp:LinqDataSource ID="LinqDataSource1"  
       ContextTypeName="AdventureWorksDataContext"  
       TableName="Products" runat="server"> 
  </asp:LinqDataSource>

  <asp:QueryExtender ID="QueryExtender1" runat="server" 
       TargetControlID="LinqDataSource1">
    <asp:SearchExpression SearchType="StartsWith" DataFields="Name" >
      <asp:ControlParameter ControlID="txtAra" />
    </asp:SearchExpression>
  </asp:QueryExtender>

  <asp:GridView ID="GridView1" runat="server"  
      DataSourceID="LinqDataSource1" AllowPaging="True" >
  </asp:GridView>

SearchExpression etiketleri arasında yer alan “SearchType” özelliğine ‘StartsWith‘ değeri, yani “girilen değerle başlayan verileri listele” değeri atanmış. Bu süzme işleminin ‘Name’ alanında yapılacağı ve txtAra isimli textBox’ın içindeki değerin baz alınacağı belirtilmiş. Bu kodlarımızı da yorumladıktan sonra neleri incelemeye çalıştık kısaca tekrar tanımlayıp sona yaklaşalım:

Expression Adı
Tanımı
ControlFilterExpression Dinamik bir veriye bağlı olarak aranan kelimenin,

arandığı kontrolde seçilmesini sağlar.

CustomExpression LINQ sorguları üzerinde süzme işlemi

yapılmasını sağlar.

DymanicFilterExpression Dinamik veri kaynakları üzerinde süzme işlemi

yapılmasını sağlar.

MethodExpression LINQ veri kaynakları üzerinde süzme işlemi

yapılmasını sağlar.

OrderByExpression İstenen veri kaynağı üzerinde sıralama işlemi

yapılmasını sağlar.

PropertyExpression SQL’deki WHERE kelimesinin taşıyıcısı olarak tanımlayabilir.

Karşılaştırma vb. sorgu işlemlerini yapar.

RangeExpression Between, büyük mü küçük mü gibi süzme işlemlerinin

yapılmasını sağlar.

SearchExpression Aranacak verinin başında mı, içinde mi, sonunda mı

olacağının belirlenmesini sağlar.

Kaynakça

MSDN

ASP.NET

Umarım yararlı olabilmişimdir.

Hoşçakalın.

Hakkında Mehmet KAPLAN
mehmet.kaplan@hotmail.com.tr https://mehmetkaplan.wordpress.com/mehmetkaplan/

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Connecting to %s

%d blogcu bunu beğendi: