Veysel Uğur KIZMAZ

LINQ ile Row Number (Sıra Numarası) Kullanımı

05.05.2014Okunma Sayısı: 7355Kategori: LINQ

Veri kümesine sıra numarası eklememiz gerekebilir. Örneğin veritabanından aldığınız bir rapor sorgusunda (personel listesi vb.) her kaydın başında sıra numarasının olması istenebilir. Entity Framework vb. bir yapı (LINQ ile sorgulama yapılan bir yapı) ile veritabanından rapor sorgulamak istediğinizde, raporun ilk sütununa satır numarasını ekleme işlemini iki şekilde yapabilirsiniz:

1. Kayıtları veritabanından alıp sıraladıktan sonra döngüyle her kaydın yanına 1’den başlayarak sıra numarası verebilirsiniz.

2. Kayıtları veritabanından alıp sıralama işlemini yaparken (personelin adına göre A’dan Z’ye sıralama) LINQ sorgusu içinde sıra numarasını da yazabilirsiniz.

İlk maddedeki işlem, çok verili (binlerce kayıt çekilen) sorgular için performans kaybına yol açabilir. Çünkü binlerce kaydı veritabanından çektikten sonra döngüyle tekrar aynı kayıtları gezmek sistemi gereksiz yere yoracaktır. Bu sebeple sorguların performansını artırmak için ikinci yöntemi kullanmak daha mantıklıdır.

Sorgulanan kayıtlara sıra numarası ekleme işlemini Select fonksiyonuyla tanımlayabilirsiniz. LINQ Select fonksiyonunda veri kümesinin tanımlayıcı değişkenini oluştururken ikinci parametre olarak sıra numarasını da belirtebilirsiniz. Ekleyeceğiniz parametre saymaya 0’dan başlayacaktır.

Standart Select fonksiyonu

calisanlar.Select(c => new { ... })

Sıra numaralı Select fonksiyonu

calisanlar.Select((c, siraNo) => new { ... })

Örnek uygulamada Personel isminde bir sınıf oluşturalım.

public class Personel
{
    public int Id { get; set; }
    public string AdSoyad { get; set; }
}

Şirketimizde çalışan personellerin adı soyadı ve Id bilgilerini bu sınıf türünde oluşturacağımız bir listede tutalım.

List<Personel> calisanlar = new List<Personel>
{
    new Personel{ Id = 1, AdSoyad = "Veysel Uğur KIZMAZ"},
    new Personel{ Id = 2, AdSoyad = "Muhammed ÖNAL"},
    new Personel{ Id = 3, AdSoyad = "Selin YETİMOĞLU"},
    new Personel{ Id = 4, AdSoyad = "Burak Selim ŞENYURT"},
    new Personel{ Id = 5, AdSoyad = "Esra SEDEF"},
    new Personel{ Id = 6, AdSoyad = "Elif BAYRAKDAR"}
};

Personelleri adına göre sıralayıp başlarına SiraNo özelliğinde kayıtların sıra numaralarını 1’den başlayacak şekilde ekleyelim.

var siraliPersoneller = calisanlar.OrderBy(c => c.AdSoyad).Select((c, siraNo) => new
{
    SiraNo = (siraNo + 1),
    AdSoyad = c.AdSoyad,
    Id = c.Id
}).ToList();

Son olarak döngüyle siraliPersoneller listesindeki tüm kayıtları ekranda yazdıralım.

foreach (var personel in siraliPersoneller)
{
    Console.WriteLine(personel.SiraNo + " " + personel.AdSoyad + " - Id: " + personel.Id);
}

Kodlamayı tamamlayıp projeyi çalıştırdığınızda ilk başta kaydın sıra numarası (1’den başlayacak şekilde), ardından personelin adı soyadı bilgisi, son bölümde de personelin Id bilgisi ekranda yazacaktır.

LINQ ile Row Number (Sıra Numarası) Kullanımı Örnek Uygulama