using System.Linq.Dynamic.Core;
using System.Collections.Generic;
using System.Text.RegularExpressions;
new Dictionary<string, object> { { "Param1", "TEST" } },
new Dictionary<string, object> { { "Param1", "TEST" } },
new Dictionary<string, object> { { "Param1", "TEST" } },
"{@Param1} != \"TEST\" && {@Param2} = 2 && {@Param1} != \"TEST1\"",
new Dictionary<string, object> { { "Param1", "TEST2" }, { "Param2", 2 } },
"{@Param1} != \"TEST\" && {@Param2} = 3 && {@Param1} != \"TEST1\"",
new Dictionary<string, object> { { "Param1", "TEST2" }, { "Param2", 3 } },
"{@Param1} != \"TEST\" && {@Param2} = 2 && {@Param1} != \"TEST1\"",
new Dictionary<string, object> { { "Param1", "TEST" }, { "Param2", 3 } },
"{@Param1} = \"TEST\" || 2 > 1",
new Dictionary<string, object> { { "Param1", "TEST2" } },
"{@Param2} < 1 || {@Param1} = \"TEST\"",
new Dictionary<string, object> { { "Param1", "TEST2" }, { "Param2", 2 } },
"{@Param2} < 1 || {@Param1} = \"TEST\"",
new Dictionary<string, object> { { "Param1", "TEST2" }, { "Param2", 0.2f } },
"{@Param1}.Contains(\"ES\")",
new Dictionary<string, object> { { "Param1", "TEST2" }, { "Param2", 0.2f } },
"{@Param1}.Contains(\"ESS\")",
new Dictionary<string, object> { { "Param1", "TEST2" }, { "Param2", 0.2f } },
void TestDyamicSqlEvaluation(string condition, Dictionary<string, object> parameters, bool expectedResult)
var result = DyamicSqlEvaluation(condition, parameters);
Console.WriteLine("{0} EXPECTED={1} ACTUAL={2} WORKED={3}", condition, expectedResult, result, expectedResult == result);
bool DyamicSqlEvaluation(string conditionWithParameterSyntax, Dictionary<string, object> parameters)
var dynamicWhereClause = GetDynamicWhereClause(conditionWithParameterSyntax, parameters);
return new List<int> { 1 }.AsQueryable().Any(dynamicWhereClause.condition, dynamicWhereClause.parameters);
(string condition, object[] parameters) GetDynamicWhereClause(string conditionWithParameterSyntax, Dictionary<string, object> parameters)
var replacements = new Dictionary<string, string>();
var whereClauseParameters = new List<object>();
var matches = Regex.Matches(conditionWithParameterSyntax, @"\{\s*@\s*(\w+)\s*\}");
foreach (var match in matches)
var key = ((Match)match).Groups[1].Value;
if (!replacements.ContainsKey(key))
replacements[key] = $"@{i}";
whereClauseParameters.Add(parameters[key]);
var condition = new StringBuilder(conditionWithParameterSyntax);
foreach (var replacement in replacements)
condition = condition.Replace($"{{@{replacement.Key}}}", replacement.Value);
return (condition.ToString(), whereClauseParameters.ToArray());