DSO.Core.DynamicLinq, çalışma zamanında gelen filtre ve sıralama isteklerini Expression<Func<T,bool>> yapılarına çeviren hafif bir .NET kütüphanesidir. IQueryable<T> ve IEnumerable<T> ile sorunsuz çalışır — Entity Framework dahil.
Bu yaklaşım, hem bellek içi koleksiyonlarda hem de bir LINQ Provider'ın (örn. EF Core) arkasındaki veritabanında güvenli ve verimli biçimde çalışmayı mümkün kılar.
Tek bir API altında toplanmış, üretim ortamına hazır bir özellik seti.
Basit metin ifadelerinden çok koşullu filtreler oluşturun.
Tekli veya çoklu kolon sıralamasını tek satırda tanımlayın.
&&, || ve iç içe parantezli karmaşık ifadeler.
Duyarlı ve duyarsız string arama operatörleri.
Status[Active,Pending] ile çoklu değer kontrolü.
Enum çözümleme ve nullable value type dönüşümü otomatik.
Property adı yazımındaki büyük/küçük harf farkı sorun yaratmaz.
ConcurrentDictionary tabanlı, tip + ifade anahtarlı önbellek.
Hem veritabanı sorgularında hem bellek içi koleksiyonlarda çalışır.
Filtre ifadelerinde kullanılabilecek tüm operatörler.
| Operatör | Anlamı | Örnek |
|---|---|---|
= / == | Eşit | Age=18 |
!= | Eşit değil | Status!=Deleted |
> / >= | Büyük / büyük veya eşit | Age>=18 |
< / <= | Küçük / küçük veya eşit | Price<100 |
| Operatör | Karşılığı | Duyarlılık |
|---|---|---|
*= | Contains | Duyarsız |
^= | StartsWith | Duyarsız |
$= | EndsWith | Duyarsız |
*== | Contains | Duyarlı |
^== | StartsWith | Duyarlı |
$== | EndsWith | Duyarlı |
| Operatör | Anlamı | Örnek |
|---|---|---|
?? | Null veya whitespace | Name?? |
!! | Null/whitespace değil | Email!! |
[] | Liste içinde bulunma | Status[Active,Pending] |
&& | AND | Age>=18 && IsActive=true |
|| | OR | City=Istanbul || City=Ankara |
| Söz Dizimi | Açıklama |
|---|---|
Price | Yön belirtilmezse artan (ASC) kabul edilir |
Price ASC | Artan sıralama |
Price DESC | Azalan sıralama |
Category ASC, Price DESC | Virgülle ayrılmış çoklu sıralama |
Sekmelere tıklayarak hızlı başlangıç, ASP.NET Core, EF Core ve generic repository örneklerini inceleyin.
using DSO.Core.DynamicLinq; // Basit filtre var adults = users.Where("Age>=18"); // Birden fazla koşul (AND) var activeAdults = users.Where("Age>=18 && IsActive=true"); // Filtre + sıralama birlikte var result = users .Where("Age>=18 && IsActive=true") .OrderBy("Department ASC, Salary DESC");
// GET /api/users?filter=Age>=18 && IsActive=true&order=LastName ASC [HttpGet] public async Task<IActionResult> Get( [FromQuery] string? filter, [FromQuery] string? order, [FromQuery] int page = 1, [FromQuery] int pageSize = 20) { var query = _db.Users.AsQueryable(); if (!string.IsNullOrWhiteSpace(filter)) query = query.Where(filter); if (!string.IsNullOrWhiteSpace(order)) query = query.OrderBy(order); var items = await query .Skip((page - 1) * pageSize) .Take(pageSize) .ToListAsync(); return Ok(items); }
// Filtre veritabanı seviyesinde (SQL WHERE) uygulanır var result = dbContext.Products .Where("IsActive=true && Price>=100") .OrderBy("Category ASC, Price DESC") .ToList(); // Akış: String → Expression<Func<T,bool>> → IQueryable.Where → SQL
public class GenericRepository<T> where T : class { private readonly DbContext _context; public GenericRepository(DbContext context) => _context = context; public List<T> GetFiltered(string? filter, string? order) { var query = _context.Set<T>().AsQueryable(); if (!string.IsNullOrWhiteSpace(filter)) query = query.Where(filter); if (!string.IsNullOrWhiteSpace(order)) query = query.OrderBy(order); return query.ToList(); } }
Filtre ve sıralama isteğinin çalışma zamanında, kullanıcıdan veya istemciden geldiği senaryolarda değer katar.
Query string üzerinden gelen filter/order parametrelerini doğrudan LINQ sorgusuna çevirir.
Kullanıcının arayüzde seçtiği alan, operatör ve değerlerden anlık filtre üretir.
Kolon başlığına göre çoklu sıralamayı "Kolon1 ASC, Kolon2 DESC" formatıyla destekler.
Tek bir generic metotla tüm entity tipleri için ortak sorgu katmanı sağlar.
Rapor kriterlerinin kullanıcı tarafından belirlendiği modüllerde parametrik sorgu üretir.
Birden fazla alanı kombinleyen arama mantığını okunabilir string olarak modeller.
.NET 6.0 ve üzeri hedeflenir. Harici bir Dynamic LINQ framework'üne bağımlı değildir.
dotnet add package DSO.Core.DynamicLinq
Install-Package DSO.Core.DynamicLinq