{"id":9347,"date":"2025-03-07T10:50:04","date_gmt":"2025-03-07T09:50:04","guid":{"rendered":"https:\/\/solidt.eu\/site\/?p=9347"},"modified":"2025-03-11T15:09:40","modified_gmt":"2025-03-11T14:09:40","slug":"system-linq-dynamic-core","status":"publish","type":"post","link":"https:\/\/solidt.eu\/site\/system-linq-dynamic-core\/","title":{"rendered":"System.Linq.Dynamic.Core"},"content":{"rendered":"\n<div style=\"height: 250px; position:relative; margin-bottom: 50px;\" class=\"wp-block-simple-code-block-ace\"><pre class=\"wp-block-simple-code-block-ace\" style=\"position:absolute;top:0;right:0;bottom:0;left:0\" data-mode=\"sh\" data-theme=\"monokai\" data-fontsize=\"14\" data-lines=\"Infinity\" data-showlines=\"true\" data-copy=\"false\">dotnet add package System.Linq.Dynamic.Core<\/pre><\/div>\n\n\n\n<div style=\"height: 250px; position:relative; margin-bottom: 50px;\" class=\"wp-block-simple-code-block-ace\"><pre class=\"wp-block-simple-code-block-ace\" style=\"position:absolute;top:0;right:0;bottom:0;left:0\" data-mode=\"csharp\" data-theme=\"monokai\" data-fontsize=\"14\" data-lines=\"Infinity\" data-showlines=\"true\" data-copy=\"false\">using System.Linq.Dynamic.Core;\n\nvar jsonInput = new\n{\n    Filter = \"Age > 30\",\n    OrderBy = \"Name\",\n    GroupBy = \"Department\"\n};\n\n\/\/ Data ophalen via EF (of een andere IQueryable-bron)\nvar query = dbContext.Employees.AsQueryable();\n\n\/\/ Dynamische filtering toepassen\nif (!string.IsNullOrEmpty(jsonInput.Filter))\n{\n    query = query.Where(jsonInput.Filter);\n}\n\n\/\/ Dynamisch sorteren\nif (!string.IsNullOrEmpty(jsonInput.OrderBy))\n{\n    query = query.OrderBy(jsonInput.OrderBy);\n}\n\n\/\/ Dynamisch groeperen\nif (!string.IsNullOrEmpty(jsonInput.GroupBy))\n{\n    query = query.GroupBy(jsonInput.GroupBy).Select(\"new(Key as Group, Count() as Count)\");\n}\n\nvar result = query.ToDynamicList();\n<\/pre><\/div>\n\n\n\n<div style=\"height: 250px; position:relative; margin-bottom: 50px;\" class=\"wp-block-simple-code-block-ace\"><pre class=\"wp-block-simple-code-block-ace\" style=\"position:absolute;top:0;right:0;bottom:0;left:0\" data-mode=\"csharp\" data-theme=\"monokai\" data-fontsize=\"14\" data-lines=\"Infinity\" data-showlines=\"true\" data-copy=\"false\">\/\/ When a property does not exist:\n\/\/System.Linq.Dynamic.Core.Exceptions.ParseException: No property or field 'NonExistentProperty' exists in type 'Employee'\n\nusing System.Reflection;\nusing System.Linq.Dynamic.Core;\n\nbool PropertyExists&lt;T>(string propertyName)\n{\n    return typeof(T).GetProperty(propertyName, BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance) != null;\n}\n\nvar jsonInput = new { Filter = \"Age > 30\", OrderBy = \"Name\" };\nvar query = dbContext.Employees.AsQueryable();\n\ntry\n{\n    if (!string.IsNullOrEmpty(jsonInput.Filter))\n    {\n        \/\/ Extract veldnaam (simpele manier)\n        string fieldName = jsonInput.Filter.Split(' ')[0]; \/\/ Eerste woord in filter\n\n        if (PropertyExists&lt;Employee>(fieldName))\n        {\n            query = query.Where(jsonInput.Filter);\n        }\n        else\n        {\n            throw new ArgumentException($\"Property '{fieldName}' bestaat niet in Employee.\");\n        }\n    }\n\n    var result = query.ToList(); \/\/ Voer query uit\n}\ncatch (Exception ex)\n{\n    Console.WriteLine($\"Fout in dynamische query: {ex.Message}\");\n}\n\n\n\n\/\/ Typing\n\n\nvar query = dbContext.Employees.AsQueryable();\nquery = query.Where(\"Age > 30\");\n\nConsole.WriteLine(query.GetType()); \n\/\/ Output: System.Linq.IQueryable&lt;Employee>\n\n\/\/ Geen typing\nvar result = query.Select(\"new(Name, Age)\").ToDynamicList();\n\n\/\/ Cast voor typing\nvar query = dbContext.Employees.AsQueryable();\nvar dynamicList = query.Select(\"new(Name, Age)\").ToDynamicList();\n\n\/\/ Handmatig casten naar Employee\nvar result = dynamicList.Select(d => new Employee\n{\n    Name = d.Name,\n    Age = d.Age\n}).ToList();\n\n\n\/\/ OR:\npublic class EmployeeDto\n{\n    public string Name { get; set; }\n    public int Age { get; set; }\n}\n\nvar query = dbContext.Employees.AsQueryable();\nvar result = query.Select&lt;EmployeeDto>(\"new(Name, Age)\").ToList();\n\n\n\n\n<\/pre><\/div>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-9347","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts\/9347","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/comments?post=9347"}],"version-history":[{"count":4,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts\/9347\/revisions"}],"predecessor-version":[{"id":9354,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts\/9347\/revisions\/9354"}],"wp:attachment":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/media?parent=9347"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/categories?post=9347"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/tags?post=9347"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}