.NET 6.0+ MIT License Sıfır Harici Bağımlılık

String bir ifadeyi, gerçek bir LINQ Expression Tree'ye dönüştürün.

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.

canlı önizleme — filtre.parse()
İfadeyi düzenleyin — kütüphanenin ürettiği Expression Tree anlık olarak aşağıda güncellenir.
Nasıl Çalışır

Kütüphane string'i doğrudan çalıştırmaz; onu ayrıştırıp bir Expression Tree'ye dönüştürür.

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.

String İfade
"Age>=18 && IsActive=true"
Parser
Parantez & operatör ayrıştırma
Expression Tree
Expression<Func<T,bool>>
IQueryable / IEnumerable
SQL veya LINQ to Objects
Özellikler

Filtreleme ve sıralama için ihtiyacınız olan her şey.

Tek bir API altında toplanmış, üretim ortamına hazır bir özellik seti.

01

String Tabanlı Filtreleme

Basit metin ifadelerinden çok koşullu filtreler oluşturun.

02

String Tabanlı Sıralama

Tekli veya çoklu kolon sıralamasını tek satırda tanımlayın.

03

AND / OR / Parantez

&&, || ve iç içe parantezli karmaşık ifadeler.

04

Contains / StartsWith / EndsWith

Duyarlı ve duyarsız string arama operatörleri.

05

IN / Liste Kontrolü

Status[Active,Pending] ile çoklu değer kontrolü.

06

Enum & Nullable Desteği

Enum çözümleme ve nullable value type dönüşümü otomatik.

07

Case-insensitive Property

Property adı yazımındaki büyük/küçük harf farkı sorun yaratmaz.

08

Thread-safe Expression Cache

ConcurrentDictionary tabanlı, tip + ifade anahtarlı önbellek.

09

IQueryable & IEnumerable

Hem veritabanı sorgularında hem bellek içi koleksiyonlarda çalışır.

Söz Dizimi Referansı

Operatörler

Filtre ifadelerinde kullanılabilecek tüm operatörler.

Karşılaştırma
OperatörAnlamıÖrnek
= / ==EşitAge=18
!=Eşit değilStatus!=Deleted
> / >=Büyük / büyük veya eşitAge>=18
< / <=Küçük / küçük veya eşitPrice<100
String Arama
OperatörKarşılığıDuyarlılık
*=ContainsDuyarsız
^=StartsWithDuyarsız
$=EndsWithDuyarsız
*==ContainsDuyarlı
^==StartsWithDuyarlı
$==EndsWithDuyarlı
Null, Liste ve Mantıksal Operatörler
OperatörAnlamıÖrnek
??Null veya whitespaceName??
!!Null/whitespace değilEmail!!
[]Liste içinde bulunmaStatus[Active,Pending]
&&ANDAge>=18 && IsActive=true
||ORCity=Istanbul || City=Ankara
Sıralama
Söz DizimiAçıklama
PriceYön belirtilmezse artan (ASC) kabul edilir
Price ASCArtan sıralama
Price DESCAzalan sıralama
Category ASC, Price DESCVirgülle ayrılmış çoklu sıralama
Kod Örnekleri

Farklı senaryolarda kullanım

Sekmelere tıklayarak hızlı başlangıç, ASP.NET Core, EF Core ve generic repository örneklerini inceleyin.

Hızlı Başlangıç
ASP.NET Core API
Entity Framework
Generic Repository
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();
    }
}
Kullanım Alanları

Kriterlerin önceden bilinmediği her yerde

Filtre ve sıralama isteğinin çalışma zamanında, kullanıcıdan veya istemciden geldiği senaryolarda değer katar.

01

REST API'ler

Query string üzerinden gelen filter/order parametrelerini doğrudan LINQ sorgusuna çevirir.

02

Yönetim Panelleri

Kullanıcının arayüzde seçtiği alan, operatör ve değerlerden anlık filtre üretir.

03

Veri Gridleri

Kolon başlığına göre çoklu sıralamayı "Kolon1 ASC, Kolon2 DESC" formatıyla destekler.

04

Generic Repository

Tek bir generic metotla tüm entity tipleri için ortak sorgu katmanı sağlar.

05

Dinamik Raporlama

Rapor kriterlerinin kullanıcı tarafından belirlendiği modüllerde parametrik sorgu üretir.

06

Gelişmiş Arama Ekranları

Birden fazla alanı kombinleyen arama mantığını okunabilir string olarak modeller.

Kurulum

Projenize ekleyin

.NET 6.0 ve üzeri hedeflenir. Harici bir Dynamic LINQ framework'üne bağımlı değildir.

.NET CLI
dotnet add package DSO.Core.DynamicLinq
Package Manager
Install-Package DSO.Core.DynamicLinq