Cumartesi, Haziran 11, 2011

ASP .Net Linq ile XML kullanımı (Linq to XML)

.Net kullanmaya başladığımdan beri en çok beğendiğim özelliklerden biri hiç kuşkusuz Linq. Gerçekten bir çok konuda işleri bir hayli kolaylaştırmakta. Linq sayesinde diziler,sql, yazının konusu olan XML ve hatta google üzerinde bile işlem yapabiliyoruz. Daha önce linq ile nasıl sql işlemleri(sorguları) yapıldığından bahsetmiştim. Bu sefer de XML ile ilgili işlemlerin nasıl yapıldığından bahsedeceğim.

Aslından Linq kullanmadan da .Net'te XML işlemleri yapmak gayet kolay. Bir çok hazır sınıfın yanında XML şeması oluşturup daha sonra bunu sınıf yapısına çevirerek nesne olarak da işlem yapmak mümkün.

XML dosyamızın yapısı aşağıdaki şekilde
<?xml version="1.0" encoding="utf-8"?>
<kullanicilar>
      <kullanici id="1">
        <ad>A</ad>
        <soyad>B</soyad>
      </kullanici>
      <kullanici id="2">
        <ad>C</ad>
        <soyad>D</soyad>
      </kullanici>
      <kullanici id="5">
        <ad>E</ad>
        <soyad>F</soyad>
      </kullanici>
      <kullanici id="8">
        <ad>G</ad>
        <soyad>H</soyad>
      </kullanici>
    </kullanicilar>

Veri Okuma
Veri okumak için XDocument sınıfından yararlanıyoruz. Bu sınıftan bir nesne türetip yine aynı sınıfın static "Load()" metodu yardımıyla dosyamızı açıyoruz ve üzerinde Linq ile işlem yapılabilir hale getiriyoruz.
protected void Page_Load(object sender, EventArgs e)
{
    XDocument doc = XDocument.Load(Server.MapPath("~/XMLFile.xml"));
    if (doc != null)
    {
        IEnumerable<XElement> myUsers = from t0 in doc.Element("kullanicilar").Elements("kullanici")
                                        select t0;

        foreach (XElement user in myUsers)
        {
            Response.Write(user.Element("ad").Value + " " + user.Element("soyad").Value + "<br />");
        }
    }
}

Dikkat çekmek istediğim diğer metodlar "Element()" ve "Elements()". İlki tek bir "XElement" nesnesi döndürürken ikincisi "IENumrable" döndürür. Bundan dolayıda myUser değişkeni "IENumrable" tipinde bir değişken olur. İşin güzel tarafı Anonymous Type şeklinde veriler oluşturmakta mümkün. Bu sayede XML dosyasından çektiğimiz verileri direk olarak GridView,Dataview yada Repeater'a DatatSource olarak aktarmak mümkün



protected void Page_Load(object sender, EventArgs e)
{
    XDocument doc = XDocument.Load(Server.MapPath("~/XMLFile.xml"));
    if (doc != null)
    {
        var myUsers = from t0 in doc.Element("kullanicilar").Elements("kullanici")
                      where t0.Element("ad").Value == "A" || t0.Element("ad").Value == "C"
                      select new 
                      { 
                        Ad = t0.Element("ad").Value,
                        Soyad = t0.Element("soyad").Value,
                      };

        grdUserList.DataSource = myUsers;
        grdUserList.DataBind();
    }
}

Veri Ekleme

protected void Page_Load(object sender, EventArgs e)
{
    XDocument doc = XDocument.Load(Server.MapPath("~/XMLFile.xml"));
    if (doc != null)
    {
        XElement myElement = doc.Element("kullanicilar");
        XElement addedElement = new XElement(new XElement("kullanici", new XElement("ad", "Esat"), new XElement("soyad", "Arslan")));
        addedElement.SetAttributeValue("id", "5");
        myElement.Add(addedElement);
        doc.Save(Server.MapPath("~/XMLFile.xml"));
        
        var myUsers = from t0 in doc.Element("kullanicilar").Elements("kullanici")
                      select new
                      {
                          Ad = t0.Element("ad").Value,
                          Soyad = t0.Element("soyad").Value,
                      };
        grdUserList.DataSource = myUsers;
        grdUserList.DataBind();
    }
}

Veri ekleme için ilk önce parent node'u seçtik. Daha sonra XElement sınıfından oluşturduğumuz nesneyi "Add()" metodunu kullanarak dosyaya ekledik ve kaydettik.

Veri Güncelleme

protected void Page_Load(object sender, EventArgs e)
{
    XDocument doc = XDocument.Load(Server.MapPath("~/XMLFile.xml"));
    if (doc != null)
    {
        XElement myElement = (from t0 in doc.Element("kullanicilar").Elements("kullanici")
                             where t0.Attribute("id").Value == "5"
                             select t0).SingleOrDefault();

        if (myElement != null)
        {
            myElement.SetAttributeValue("id", "100");
            doc.Save(Server.MapPath("~/XMLFile.xml"));
        }

        var myUsers = from t0 in doc.Element("kullanicilar").Elements("kullanici")
                      select new
                      {
                          ID = t0.Attribute("id").Value,
                          Ad = t0.Element("ad").Value,
                          Soyad = t0.Element("soyad").Value,
                      };
        grdUserList.DataSource = myUsers;
        grdUserList.DataBind();
    }
}

Linq cümlesi kullanarak "id" değeri "5" olan kaydı çektik, xml yapısında ID değerleri nitelik(attribute) olarak girildiği için "SetAttributeValue()" metodu ile değerini "100" olarak değiştirip dosyayı kaydettik.

Kolay gelsin...

Perşembe, Haziran 02, 2011

Google +1 Butonu

Google yeniliklerine bir yenisini daha ekledi. Bir kaç hafta önce gmail için "Önemli posta" uygulamasını uygulamaya koymuştu. Şimdide arama motoru için "Google +1 Butonu" hizmetini kullanıma koydu. Anlaşılan google daki amcalar boş durmuyorlar.

Google +1 Butonu Nedir?
Peki nedir bu hizmet derseniz bana ilk anımsattığı şey facebook daki "Beğen" uygulması oldu. Burdaki mantığı arama sonuçlarına yansıtarak daha kaliteli bir arama sonucu hizmeti vermeyi planlamışlar. Bence gayet de iyi olmuş. Bu sayede internet ortamındaki bilgi kirliliğinin bir nebze de olsa önüne geçilmiş olacak. Daha detaylı bilgi için burdan yararlanabilirsiniz.


Google +1 Butonunu Siteme Nasıl Yerleştirebilirim?
Uygulamayı siteye koymaksa gayet kolay. 2 adımda bunu yapabilirsiniz.

1-Aşağıdaki kodu sitenizin "<head></head>" tagları arasına yapıştırın.
<script type="text/javascript" src="http://apis.google.com/js/plusone.js">
  {lang: 'tr'}
</script>

2-Bu kodu "Google +1 Butonu'nun" gözükmesini istediğiniz yere yapıştırın.

<g:plusone></g:plusone>

Kolay gelsin...

Pazar, Mayıs 01, 2011

Ubuntu 11.04 Natty Narwhaldan İzlenimler

En son ubuntu 10.04 sürümünü bilgisayara kurmuştum. Ubuntu 10.10 Maverick Meerkat versiyonunu kurup deneme fırsatım olmadı. Yaklaşık olarak 1 yıl aradan sonra yeni bir ubuntu sürümünü kurabildim.

Arada bir sürüm atlamama rağmen Ubuntu 11.04 Natty Narwhal beni köklü bir değişikliğin beklediğinin farkındaydım. Ve birazda heyecanlıydım. Çünkü Canonical'ın gnome masaüstü uçurup yerine kendi geliştirdiği unity masaüstü getireceğini biliyordum.

Kurulumda yapısal değişikliğe gitmişler. Bölge ve dil ayarlarını yaparken de kopyalama işlemine devam etmesi veya güncellemelerin kurulumla beraber yüklenmesi gibi. Gerçi bunlar 10.10 ile gelen özellikler ama benim ilk kez bunu deneme fırsatım oldu.

Lakin kurulum bitirip kullanmaya başlayınca unity beni şaşırtmaya başladı. Şaşırmama sebep olan şey(ler) ise kurar kurmaz karşılaştığım hatalar. Ubuntu gibi geniş bir kitleye sahip(Linux dağıtımı olarak) bir işletim sisteminin sorunlu bir masaüstü ile nasıl yayınlanabildiği. İlk bir iki hatanın ekran görüntüsünü alıp paylaşmayı planladım ama hataların arkası gelmeye devam edince vazgeçtim.

KDE masaüstülü Kubuntu değilde Gnome masaüstülü Ubuntuyu tercih etmemdeki en önemli etken sadeliği ve kullanışlı olmasıydı. İstediğime hemen ulaşa biliyordum. Ve windowsdan daha farklı bir masaüstü yaklaşımı vardı. Ama unity de durum böyle değil. Windows 7 ye benzer bir görev çubuğu var. Yeni bir uygulama açtığımda farklı bir sekme açmak yerine direk programın kısayolunun olduğu yere gurupluyor. Programın kısayolunun üzerine geldiğimde diğer pencerelere ulaşabiliyorum. Direk kurulu olarak gelen firefox da bu sistem sorun çıkartmıyor ama chrome'u gurup farklı 2 pencere açtığımda bir türlü ikinci pencereye sorunsuz ulaşamadım. Win 7 nin bu özelliğinden, doğru bir şekilde çalışmasına rağmen hiç hoşnut değildim, unity de de aynı sistemi daha BECERİKSİZ haliyle yapmışlar. Kullanmaya başlayalı 1-2 saat olmasına rağmen beni deli etmeyi başardı.

Beklentiler istenildiği gibi çıkmayınca böyle bir yazıda kaçınılmaz oldu tabi.Bu zamana kadar Ubuntu ile ilgili hep güzel şeyler yazdım, bu yazı ise alışılmışın dışında oldu. Lakin alışabilirim umudu ile Unity şu an için kaldırmayı düşünmüyorum. Biraz daha şansı hakediyor. Alışamazsamda hiç acımam Gnome kurar işime bakarım. Linux kullanmanın güzel yanı da bu aslında bir uygulamayı beğenmediysen alternatif çok.

Kolay gelsin...

Cumartesi, Nisan 16, 2011

ASP .Net RegisterStartupScript() ve RegisterClientScriptBlock() arasındaki fark

ASP .net ile javascript fonksiyonlarını tetikleyebileceğimiz metodlardan ikisi RegisterStartupScript() ve RegisterClientScriptBlock(). Bu yazıda bunların nasıl kullanıldığından ziyade aralarındaki farktan bahsedeceğim.

Ben server tarafında gerçekleşen bir olaydan sonra uyarı verdirmek için RegisterClientScriptBlock() kullanırdım. Lakin bir gün uyarı verdirmekten daha fazlasına ihtiyaç duydum. Mesela jQuery kullanarak sayfa içindeki bir elementin içeriğini değiştirmek gibi.

RegisterClientScriptBlock() kullanarak sayfadaki html elementlere erişmeyi başaramadım. Çünkü bu metod sayfadaki html elementleri render edilmeden çalışıyormuş.

Google da kısa bir aramadan sonra istediğimi yapmak için kullanmam gereken RegisterStartupScript() metodunu keşfettim.

Sayfanın Page_Load olayına aşağıdaki kodları eklediğimizde önce "Register Client Script Block" daha sonra "Register Startup Script" mesajlarını alırız.

protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
ClientScript.RegisterStartupScript(this.GetType(), "Mesaj1", "<script type='text/javascript'>alert('Register Startup Script')</script>");
ClientScript.RegisterClientScriptBlock(this.GetType(), "Mesaj2", "<script type='text/javascript'>alert('Register Client Script Block')</script>");
}
}


Şimdi de her iki metodu kullanarak sayfa içindeki html elementine erişip içeriğini değiştirmeyi deniyelim. Kodlar aşağıdaki şekilde.

Default.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<script type="text/javascript">
function icerikDegistir(icerik) {
var myDiv = document.getElementById("mesaj");
if (myDiv != null) {
myDiv.innerHTML = icerik;
}
else {
alert("Element bulunamadı");
}
}
</script>
</head>
<body>

<form id="form1" runat="server">
<div>
<asp:Button ID="btnScriptBlock" runat="server" Text="Script Block"
onclick="btnScriptBlock_Click" />
<asp:Button ID="btnStartupScript" runat="server" Text="Startup Script"
onclick="btnStartupScript_Click" />
<div id="mesaj"></div>
</div>
</form>
</body>
</html>


Default.aspx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{

}
protected void btnScriptBlock_Click(object sender, EventArgs e)
{
ClientScript.RegisterClientScriptBlock(this.GetType(), "ScriptBlock", "<script type='text/javascript'>icerikDegistir('Register Client Script Block')</script>");
}
protected void btnStartupScript_Click(object sender, EventArgs e)
{
ClientScript.RegisterStartupScript(this.GetType(), "StartupScript", "<script type='text/javascript'>icerikDegistir('Register Startup Script')</script>");
}
}










İlk resimde Script Block butonuna tıkladım ve "Element bulunamadı" şeklinde uyarı aldım. Ve resimde farkettiyseniz henüz butonlar görünmüyor. İkinci resimde ise Startup Script butonuna tıkladıktan sonra divin içeriğinin istediğim şekilde değiştiğini görüyoruz.

Bu yazınında sonuna geldik. Faydalı olması dileği ile kolay gelsin...

Pazar, Mart 13, 2011

Linq ile Row_Number() Kullanımı

Bazen veri tabanından verileri sıralı olarak satır numaralarına göre çekmek isteyebiliriz. Örneğin NorthWind veri tabanını kullanarak Products tablosundan ProductName,UnitPrice ve QuantityPerUnit alanlarını satır numarası ile birlikte çekelim. Mssql'de böyle bir iş için aşağıdakine benzer bir sql cümlesi yazarak işimizi halledebiliriz.


select row_number() over (order by ProductID) as 'Satır No', ProductName, UnitPrice, QuantityPerUnit from Products


Şimdide böyle bir işlemin linq ile nasıl yazıldığına bakalım.


var productInfo = db.Products.Select(s => new { s.ProductName,s.UnitPrice,s.QuantityPerUnit})
.AsEnumerable()
.Select((s, sayac) => new
{
s.ProductName,
s.UnitPrice,
s.QuantityPerUnit,
satir_no= sayac + 1
});



Ne yaptığımıza bakacak olursak. İlk select işleminde ilgili alanları veri tabanında çektik. AsEnumarable() ile normalde IQueryable olan dönüş değerini IEnumerable'a çevirdik.

Dikkat etmemiz gereken yer ikinci select işlemi. Burada parantez içinde s ve sayac adında iki tane parametre tanımladık. s tablonun kendisine referans eder. sayac ise sıfırda başlayarak her kayıt için bir artan değişken görevini görür.

Linq ile Row_Number() kullanımı bu kadar.

Kolay gelsin...

Cumartesi, Şubat 12, 2011

Hastir öyle mi? (Yılmaz ÖZDİL)

Noel arifesi...

Lefkoşa.


Kumsal Mahallesi.
Numara 2.
Tek katlı, bahçeli ev.
Saat 22 suları.
Hava ayaz.
Boğuk, tok vuruşlar yırtıyor geceyi aniden, trok trok trok...
Kalleş, basıyor.
*
Mürüvvet Hanım, lambaları söndürüyor telaşla... Hakan kucağında. Uyuyor. Bebe. 10aylık... Dalıyor çocukların odasına, öbür koluna Kutsi’yi alıyor, 4 yaşında... “Kalk Murat”diyor bi yandan... Gözlerini ovuştura ovuştura kalkıyor Murat, henüz 6 yaşında. Eteğinin ucundan tutuyor anasının geceliğini... Dışardan hüzün abajuru gibi sızan sokaklambasının cılız ışığında, hayalet misali, parmaklarının ucuna basa basa banyoya süzülüp,dördü birden “küvet”e giriyor ve koyun koyuna sarılıyorlar, çıt çıkarmadan, duyulmasındiye nefes bile almadan.../_np/8932/12638932.jpg
*
Korkunç bekleyiş başlıyor.
*
Bir dakika.
İki dakika.
Üç dakika.
Saniyeler...
Asırlar gibi adeta.
Önce şangırtı duyuyorlar.
Pencere.
Kırılıyor.
Sonra, ayak sesleri...
Salondalar.
Vahşi haykırışları geliyor.
Ve, tekmeyle açılıyor banyonun kapısı...
Üç Rum.
Tarıyorlar.
33 el.
*
Evet, merhum gazeteci Sami Coşar tarafından çekilen ve hafızalarımıza mıh gibi çakılan “ofotoğraf”ın öyküsü bu...
Kanlı Noel.
*
Alnından vurmuşlardı Mürüvvet Hanım’ı, yedi yerinden daha...
Murat’tan üç kurşun çıktı.
Kutsi’den iki.
*
Evin direği, baba, tabip binbaşı, evde değildi o sırada... 103 Türk köyü basılmıştı son üçgünde, yaralılar vardı... Gönyeli’ye gitmişti. Göreve.
*
Bir babanın başına gelebilecek en büyük felaketi yaşayan bu tabip binbaşı, evlatlarınıncenazesini bizzat kendi elleriyle yıkadı... Minik bedenleri santim santim yokladı, Hakan’dakurşun izi bulamadı. 10 aylık bebecik... Vücudunu yavrularına siper etmeye çalışan anacığının altında kalmış, nefessizlikten boğularak can vermişti çünkü.
*
Sonra?
*
Rum taburu vardı oralarda...
Nizamiyesinde şu yazıyordu:
“Cesursan, gel al!”
*
Türk taburu kuruldu oraya...
Nizamiyesine şu yazıldı:
“Cesurum, geldim aldım!”
*
Bugün, oralarda, utanmadan, Türkiye defolsun gitsin diye “hastir” pankartı açan Rumdalkavuğu lavuk!
Yüreğin varsa...
Gel de al.

Cumartesi, Ocak 29, 2011

Ubuntu Flash Player Donma Sorunu

Ubuntuda ki tipik flash player sorunlarından biride tam ekran video izlerken donma olması. Ubuntu forumlarından okuduğum kadarıyla sorunun çözümü herkes için aynı olmaya biliyor.Ben bu sorundan aşağıdaki adımları uygulayarak kurtulabildim. Umarım işinize yarar...

1- /etc dizinine adobe adından bir dizin oluşturuyoruz.
sudo mkdir /etc/adobe

2- mms.cfg adından bir dosya oluşturup içine OverrideGPUValidation değerini true olarak ayarlayarak ekledik. Bu ayar sayesinde flash playerın her seferinde yaptığı GPU hızlandırma kontrolünü devre dışı bırakmış oluyoruz.

echo "OverrideGPUValidation=true" >~/mms.cfg

3- Son olarak mms.cfg dosyasını 1.adımda oluşturduğumuz /etc/adobe dizinine taşıyoruz.

sudo mv ~/mms.cfg /etc/adobe/


Daha az sorunlu flash player dileğiyle...
Kolay gelsin...

Pazar, Ocak 23, 2011

Linq ile NewID() Kullanımı

Amacımız veri tabanından rastgele 4 kayıt çekmek olsun. Bu işlemi gerçekleştirmek için aşağıdaki gibi bir sql cümlesi kullanırız.

select top 4 EmployeeID,LastName,FirstName,Title,TitleOfCourtesy from Employees order by NewID()

Böyle bir işlemi linq ile yapmak için harici bir fonksiyona ihtiyaç duyarız. Fonksiyon aşağıdaki şekilde.

[Function(Name = "NEWID", IsComposable = true)]
public Guid NewID()
{
return Guid.NewGuid();
}

Fonksiyonun yaptığı iş sadece ilgili kayıt için yeni bir guid döndürmek. Bu fonksiyonu kullanabilmek için iki seçeneğimiz var:

1. Fonksiyonu dbml'in .cs dosyasına içine eklemek
2. dbml sınıfı partial class olduğu için yeni bir ".cs" dosyası açıp dbml sınıfı ile aynı isimde partial class oluşturup fonksiyonu buraya koyabiliriz.

Yukarıdaki seçeneklerden birini kullanarak fonksiyonu kullanıma hazır hale getirdikten sonra, en baştaki sql cümlesini linq ile yazarak eklediğimiz fonksiyonun linq ile kullanımını görelim.

var employess = (from t0 in linqDB.Employees
orderby linqDB.NewID()
select new
{
t0.EmployeeID,
t0.LastName,
t0.FirstName,
t0.Title,
t0.TitleOfCourtesy
}).Take(4);


Kolay gelsin...

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...