System.Linq.Dynamic.Core

Date: 2025-03-07
dotnet add package System.Linq.Dynamic.Core
using System.Linq.Dynamic.Core;

var jsonInput = new
{
    Filter = "Age > 30",
    OrderBy = "Name",
    GroupBy = "Department"
};

// Data ophalen via EF (of een andere IQueryable-bron)
var query = dbContext.Employees.AsQueryable();

// Dynamische filtering toepassen
if (!string.IsNullOrEmpty(jsonInput.Filter))
{
    query = query.Where(jsonInput.Filter);
}

// Dynamisch sorteren
if (!string.IsNullOrEmpty(jsonInput.OrderBy))
{
    query = query.OrderBy(jsonInput.OrderBy);
}

// Dynamisch groeperen
if (!string.IsNullOrEmpty(jsonInput.GroupBy))
{
    query = query.GroupBy(jsonInput.GroupBy).Select("new(Key as Group, Count() as Count)");
}

var result = query.ToDynamicList();
// When a property does not exist:
//System.Linq.Dynamic.Core.Exceptions.ParseException: No property or field 'NonExistentProperty' exists in type 'Employee'

using System.Reflection;
using System.Linq.Dynamic.Core;

bool PropertyExists<T>(string propertyName)
{
    return typeof(T).GetProperty(propertyName, BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance) != null;
}

var jsonInput = new { Filter = "Age > 30", OrderBy = "Name" };
var query = dbContext.Employees.AsQueryable();

try
{
    if (!string.IsNullOrEmpty(jsonInput.Filter))
    {
        // Extract veldnaam (simpele manier)
        string fieldName = jsonInput.Filter.Split(' ')[0]; // Eerste woord in filter

        if (PropertyExists<Employee>(fieldName))
        {
            query = query.Where(jsonInput.Filter);
        }
        else
        {
            throw new ArgumentException($"Property '{fieldName}' bestaat niet in Employee.");
        }
    }

    var result = query.ToList(); // Voer query uit
}
catch (Exception ex)
{
    Console.WriteLine($"Fout in dynamische query: {ex.Message}");
}



// Typing


var query = dbContext.Employees.AsQueryable();
query = query.Where("Age > 30");

Console.WriteLine(query.GetType()); 
// Output: System.Linq.IQueryable<Employee>

// Geen typing
var result = query.Select("new(Name, Age)").ToDynamicList();

// Cast voor typing
var query = dbContext.Employees.AsQueryable();
var dynamicList = query.Select("new(Name, Age)").ToDynamicList();

// Handmatig casten naar Employee
var result = dynamicList.Select(d => new Employee
{
    Name = d.Name,
    Age = d.Age
}).ToList();


// OR:
public class EmployeeDto
{
    public string Name { get; set; }
    public int Age { get; set; }
}

var query = dbContext.Employees.AsQueryable();
var result = query.Select<EmployeeDto>("new(Name, Age)").ToList();




93470cookie-checkSystem.Linq.Dynamic.Core