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();
934700cookie-checkSystem.Linq.Dynamic.Core