OrmLite v10.4: recursive, pencere ve birleşik sorgular tipli API ile geliyor
ServiceStack v10.4, OrmLite'a hiyerarşik sorgular için WithRecursive(), adlandırılmış alt sorgular için With(), pencere fonksiyonları, Union/Intersect/Except ve SeekAfter ile keyset sayfalama ekliyor. Elle yazılan SQL metinlerine gerek kalmadan bu sorgular tipli, parametreli ve veritabanları arasında taşınabilir kalıyor. Yazıda her özelliğin kullanım örnekleri ve üretilen SQL'i yer alıyor.
Kilit noktalar
- WithRecursive(seed, recurse) ile hiyerarşileri tek sorguda gezin; maxDepth ve detectCycles döngülü veriyi de kapsar
- With<T>() ile alt sorguyu bir sınıfa bağlayıp birden fazla yerde tipli olarak kullanın
- TopPerGroup(x => x.Customer, take: 3) müşteri başına son 3 siparişi tek ifadeyle getirir
- Union, Intersect ve Except sorgu parametrelerini otomatik birleştirir; Firebird INTERSECT ve EXCEPT desteklemez
- SeekAfter() sıralamanın son sütununa benzersiz bir alan (ör. Id) koyulmasını gerektirir
- SelectLazyAsync() ile büyük sonuçları await foreach ile akıtın; döngüden çıkınca okuyucu kapanır
ServiceStack v10.4 ile OrmLite, genelde elle yazılan SQL'e ihtiyaç duyulan sorgular için tipli API'ler sunuyor. Kategori ağaçları gibi hiyerarşileri gezmek için WithRecursive(), bir alt sorguyu ortak tablo ifadesi (CTE) olarak adlandırmak için With(), sıralama ve kümülatif toplam gibi hesaplar için pencere fonksiyonları ve grup başına ilk N satır için TopPerGroup() eklendi. Union, Intersect ve Except ile sorgular birleştirilebiliyor, SeekAfter() ise sayfalamayı imleç mantığıyla yapıyor.
Bu özellikler filtre, join ve sıralama ile birlikte çalışıyor ve PostgreSQL, SQL Server, SQLite 3.25+, MySQL 8+, MariaDB ve Oracle üzerinde destekleniyor. Büyük sonuçlar için SelectLazyAsync() satırları tek tek akıştırıyor. Yazıda derinlik sınırı, döngü tespiti ve Firebird'de INTERSECT ve EXCEPT desteğinin olmadığı gibi sınırlamalar da anlatılıyor. Ayrıntılar ve üretilen SQL için orijinal yazıya bakmanız yeterli.
Gerçek dünyada kullanımı
- Kategori veya organizasyon şemasını ağaç olarak gezen bir ASP.NET Core API
- Müşteri başına son siparişleri veya grup bazlı en yüksek kayıtları listeleyen raporlama ekranı
- Sonsuz kaydırma ya da senkronizasyon endpoint'i için derin sayfalara hızlı erişim sağlayan keyset sayfalama
- Büyük bir tabloyu bellek tüketmeden dışa aktaran arka plan işçisi
Neden önemli
Hiyerarşi, pencere fonksiyonu ve keyset sayfalama gibi karmaşık sorgular artık tipli kalıyor; veritabanı değiştiğinde SQL metinlerini yeniden yazmak gerekmiyor. Yine de her özelliğin desteklendiği veritabanını ve üretilen SQL'i kendi projenizde kontrol etmeniz iyi olur.