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