Bilmek istediğin her şeye ulaş

Asp.Net'te iki tarih arasında çekmiş olduğum veri boyutu 500.000 satırlara dayanabilmekte. Bu verileri Asp.Net'te parçalı olarak gösterebileceğim bir yapı var mıdır? Bu parçalı yapı için araştırmam gereken konu/konular nedir?

Ben şu an girilen tarih aralığını kendi içimde parçalayıp session 'larda tutuyorum ve ileri - geri butonlarıyla bu tarihler arasında gezinmesini sağlıyorum. Henüz data'yı kendi içerisinde sayfalara bölmesini sağlayamadım. MVC de bunun için basit bir nugget vardı ama webform 'da nasıl bir çalışma yapmam gerektiğini henüz bilemiyorum. Bu yapı içerisinde aşağıda tablo şeklinde bulunan verinin birde yukarıda grafiksel çizimi var.. onun için sayfalı geçiş yapısı sanki benim için daha uygun olacak... Henüz tam olarak nasıl google lamam gerektiğini bulamadım :)Düzenle
Sql kendi içinde halleder. Linq'da yazıyorum. Eski tarih X, yeni tarih Y olsun ve her seferinde 100 kayıt çekmek isteyelim. Veritabanı db'ye çekilmiş olsun Tablo ise Tablo ile temsil ediyorum.

DateTime dt = X;
 
            while (1)
            {
                var kayit100 = db.Tablo.Where(d => dt <= d.DateTİme & &d.DateTİme < Y).Sort(d => d.DateTİme).Take(100);
 
                // kısmi kayıtla yapılması gerekeni yap.
 
                if (kayıt100.Count() < 100)
                {
 
                    //daha fazla kayıt yok demek işlem bitebilir. 
                    break;
 
                }
 
                dt = kayit100.Select(d => d.DateTime).Min();
 
            }

Ben genellikle kısmi kayıt çekimini bu şekilde LINQ'a yıkıyorum.
  • Paylaş
3

Birkan Aydin, Ben şu an girilen tarih aralığını kendi içimde parçalayıp session 'larda tutuyorum ve ileri - geri butonlarıyla bu tarihler arasında gezinmesini sağlıyorum. Henüz data'yı kendi içerisinde sayfalara bölmesini sağlayamadım. MVC de bunun için basit bir nugget vardı ama webform 'da nasıl bir çalışma yapmam gerektiğini henüz bilemiyorum. Bu yapı içerisinde aşağıda tablo şeklinde bulunan verinin birde yukarıda grafiksel çizimi var.. onun için sayfalı geçiş yapısı sanki benim için daha uygun olacak... Henüz tam olarak nasıl google lamam gerektiğini bulamadım :) yardımlarınız için çok çok teşekkürler.

Ceyhun Çakar, Burada kullandığım mantığı controller dosyasında kullanabilirsin. while döngüsü içine değil ajax çağrı metodu içine koyup benim kullandığım dt'i de controller private'i haline getirirsen (böyle bir çağrı daha önceki çağrının ulaştığı son tarih zamanı bilir)

Birkan Aydin, Akşama bu olayı test edeceğim. Ben henüz linq 'ya geçiş yapamadım.. hala Sql procedure 'ler ile boğuşuyorum. :) ajax 'taki pagemethods ile birleştirip denemeye çalışacağım.

Şimdi bu işlemi LINQ sorgusu içinde şu şekilde parametrik olarak halledebilirsin:

DateTime start = DateTime.Now.AddDays(-60);
DateTime end = DateTime.Now;
 
var index = 0;
var count = 20;

var query = (from a in db.Table
             where a.DateTime > start && a.DateTime < end
             orderby a.DateTime descending
             select a)
             .Skip(index * count)
             .Take(count);
 

Yukarıdaki kodda index "0" olduğunda, ilk 20 kayıt alınacaktır.
Benzer biçimde index "1" olduğunda, ilk 20 kayıt geçilir ve sonraki 20 kayıt alınır.

index parametresini vererek otomatik olarak "paging" dediğimiz işlemi gerçekleştirebilirsin.

Böylece tüm veriyi çekmemiş oluyorsun (ki tüm veriyi çekmek yanlıştır) ve istediğin parçasını almış oluyorsun. Umarım faydalı olur bu bilgiler.

Bir Not: SQL Server normalde runtime'da maximum olarak 2100 row döner. Yani senin yaptığın sorgu sonucunda eğer 500.000 kayıt dönülmesi gerekiyor ise bunu dönmez ve hata oluşturur. Hatta daha yüksek olasılıkla zaten Request Timeout olacaktır.
  • Paylaş
2

Hakan Köse, Bir de ayrıca, sorgudaki Take(count) kısmını Take(count + 1) olarak değiştirirsen, bir sonraki 20 kaydın var olup olmadığını da anlayabilirsin. Yani diyelim ki, sayfalamayı ekranda göstereceksin ve NEXT PAGE butonunun ne zaman kapatılacağını bilmek gerekiyor. Sorgudan 5. 20 adet kaydı istediğinde sana 21 adet kayıt dönüyorsa, demek ki 6. sayfalama mevcuttur ve NEXT butonunu açık tutmalısın.

Yukarıdaki kodu işleten fonksiyonuna bunu bir out parameter (out bool hasmoreitem) olarak ekleyebilirsin.

Birkan Aydin, Tamam 500.000 satırı ben uydurmuş olabilirim :) ama sql server runtime da max kaç satır döndürür sorusu aklıma gelmeyebilir. Bu küçük yalan ile bir bilgi daha edinmiş oldum. Çok teşekkür ederim. Tecrübe ve bilgilerinizi paylaştığınız için size minnettarım.

Sonraki Soru
HESAP OLUŞTUR

İstatistikler

83 Görüntülenme4 Takipçi2 Yanıt

Eş Anlamlı Soru Ekle

  • LINQ sorgusu ile pagination nasıl yapılır?

  • ASP.NET ile sayfalama (paging) nasıl yapılır?