Cumartesi, Ocak 01, 2011

Dinamik Linq Sorgusu Yazma

Nasıl bir giriş bölümü yazsam diye düşündüm aklıma hiç bir şey gelmedi. O yüzden direk mevzuya giriş yapıyorum. İşte mevzu;

Amacımız, başlıkta da açık ve net olarak belirttiğim gibi dinamik linq sorgusu yazmak. Böyle bir işlemi visiaul studio kurulumuyla gelen default linq sınıfları ile yapamıyoruz. Harici olarak bir şeyler yüklememiz gerekli. Ama tabi yükleme işlemleri için taklalar atmamıza (kütüphane derleme falan filan yani) gerek yok - .Net in en sevdiğim yanı. Sağolsun Microsofttaki amcalar bizim için bir sınıf yazmışlar. Bize düşen bu sınıfı indirip projemize dahil etmek.

İndir

Öncelikle dinamik linq ile kastımız ne buna bakalım. Senaryomuz şu şekilde, elimde bir dropdownlistim(php ce si combobox) ve datagridim var. Dropdownın içinde tablodaki alan adları var. Listeden seçtiğim alan adına göre griddeki verilerimin sıralanmasını(orderby) istiyorum. Dinamik linq kullanmadan bu sorguyu aşağıdaki gibi yazabiliriz.

protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
/* Value index
* ---- -------
* FirstName 0
* LastName 1
* Address 2
*/
var employess = from t0 in db.Employees
select new
{
t0.FirstName,
t0.LastName,
t0.Address
};
switch (DropDownList1.SelectedIndex)
{
case 0: employess = employess.OrderBy(o => o.Name); break;
case 1: employess = employess.OrderBy(o => o.LastName); break;
case 2: employess = employess.OrderBy(o => o.Address); break;
}

GridView1.DataSource = employess;
GridView1.DataBind();
}



Ne yaptığımıza bakacak olursak. Önce bütün verileri employess değişkenine çektik. Daha sonra switch() yarıdımı ile dropdownlistten seçilen değerin index numarasına göre karşılaştırma yaparak, veriyi sıraladık ve employess değişkenine aktardık.

Görüldüğü gibi dinamik linq kullanmadan switch() kontrolü ile istediğimiz işlemi gerçekleştirdik. Lakin fazladan bir kontrol yapısı kullanmış olduk. Daha kompleks sorgularda yazacağımız kod satırı daha da artacaktır.

Şimdide dinamik bir linq sorgusu ile işlemi nasıl gerçekleştireceğimize bakalım.

protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
var employess = (from t0 in db.Employees
select new
{
t0.FirstName,
t0.LastName,
t0.Address
}).OrderBy(DropDownList1.SelectedValue);

grdListe.DataSource = employess;
grdListe.DataBind();
}



Gördüğünüz gibi ekstradan bir kontrol yapısına ihtiyaç duymadan dropdownlistin value değerine göre sıralamayı gerçekleştirdik.

Bu uygulamaya bir de arama özelliği ekleyelim. Bunun için ikinci bir dropdownlist,textbox ve button nesnelerini kullanacağız. Dropdownlistten hangi alan adına göre arama yapacağımızı seçip,textboxada aranacak kelimeyi gireceğiz.Bu işlem için butonun tıklama olayındaki kod aşağıdaki gibi olacak.

protected void btnAra_Click(object sender, EventArgs e)
{
var employess = db.Employees.Where(ddlAlanAdi.SelectedValue + ".Contains(@0)", txtKelime.Text)
.Select(s => new {s.FirstName,s.LastName,s.Address});

grdListe.DataSource = employess;
grdListe.DataBind();
}



Bu örnekte dinamik linq kullanımının esnekliğini daha iyi görebiliyoruz. "@" yardımı ile aralara istediğimiz değerleri parametre olarak ekleyebiliyoruz. Benim anlatacaklarım bu kadar. Uygulamanın tamamını buradan indirebilirsiniz.

Kolay gelsin...


Hiç yorum yok: