コード例 #1
0
        public ExpressionParserTests()
        {
            _dynamicTypeProviderMock = new Mock <IDynamicLinkCustomTypeProvider>();
            _dynamicTypeProviderMock.Setup(dt => dt.GetCustomTypes()).Returns(new HashSet <Type>()
            {
                typeof(Company), typeof(MainCompany)
            });
            _dynamicTypeProviderMock.Setup(dt => dt.ResolveType(typeof(Company).FullName)).Returns(typeof(Company));
            _dynamicTypeProviderMock.Setup(dt => dt.ResolveType(typeof(MainCompany).FullName)).Returns(typeof(MainCompany));
            _dynamicTypeProviderMock.Setup(dt => dt.ResolveTypeBySimpleName("Company")).Returns(typeof(Company));
            _dynamicTypeProviderMock.Setup(dt => dt.ResolveTypeBySimpleName("MainCompany")).Returns(typeof(MainCompany));

            _parsingConfig = new ParsingConfig
            {
                CustomTypeProvider = _dynamicTypeProviderMock.Object
            };
        }
コード例 #2
0
 internal override Expression <Func <RuleInput, RuleResultTree> > BuildExpressionForRule(Rule rule, IEnumerable <ParameterExpression> typeParamExpressions, ParameterExpression ruleInputExp)
 {
     try
     {
         var config = new ParsingConfig {
             CustomTypeProvider = new CustomTypeProvider(_reSettings.CustomTypes)
         };
         var e    = DynamicExpressionParser.ParseLambda(config, typeParamExpressions.ToArray(), null, rule.Expression);
         var body = (BinaryExpression)e.Body;
         return(Helpers.ToResultTreeExpression(rule, null, body, typeParamExpressions, ruleInputExp));
     }
     catch (Exception ex)
     {
         var binaryExpression = Expression.And(Expression.Constant(true), Expression.Constant(false));
         var exceptionMessage = ex.Message;
         return(Helpers.ToResultTreeExpression(rule, null, binaryExpression, typeParamExpressions, ruleInputExp, exceptionMessage));
     }
 }
コード例 #3
0
        public void FilterByNullableLocalDate_WithDynamicExpressionParser_CompareWithNull(string equal, int numberOfEntities)
        {
            // Arrange
            var config = new ParsingConfig
            {
                TypeConverters = new Dictionary <Type, TypeConverter>
                {
                    { typeof(LocalDate), new LocalDateConverter() }
                }
            };

            // Act
            var expr   = DynamicExpressionParser.ParseLambda <Entity, bool>(config, false, $"BirthDateNullable {equal}");
            var result = entities.AsQueryable().Where(expr).ToList();

            // Assert
            result.Should().HaveCount(numberOfEntities);
        }
コード例 #4
0
        public void ExpressionHelper_TryGenerateAndAlsoNotNullExpression_Nested3NonNullable_Config_Has_UseDefault()
        {
            // Assign
            var config = new ParsingConfig
            {
                NullPropagatingUseDefaultValueForNonNullableValueTypes = true
            };
            var expressionHelper = new ExpressionHelper(config);

            Expression <Func <Item, int> > expression = x => x.Relation1.Relation2.Id;

            // Act
            bool result = expressionHelper.TryGenerateAndAlsoNotNullExpression(expression, true, out Expression generatedExpression);

            // Assert
            Check.That(result).IsTrue();
            Check.That(generatedExpression.ToString()).IsEqualTo("((((x != null) AndAlso (x.Relation1 != null)) AndAlso (x.Relation1.Relation2 != null)) AndAlso (x => x.Relation1.Relation2.Id != null))");
        }
コード例 #5
0
        public void Entities_Select_BrokenObject()
        {
            ParsingConfig config = ParsingConfig.Default;

            config.DisableMemberAccessToIndexAccessorFallback = false;

            // Silently creates something that will later fail on materialization
            var test = _context.Blogs.Select(config, "new(~.BlogId)");

            test = test.Select(config, "new(nonexistentproperty as howcanthiswork)");

            // Will fail when creating the expression
            config.DisableMemberAccessToIndexAccessorFallback = true;
            Assert.ThrowsAny <ParseException>(() =>
            {
                test = test.Select(config, "new(nonexistentproperty as howcanthiswork)");
            });
        }
コード例 #6
0
        /// <summary>
        /// Using a hack data source, query with custom types
        /// </summary>
        static void TestUnit3()
        {
            var data = new TestData();

            var dataSource = new BlackBoxDataSource <Person>();

            dataSource.DataSource = data.Persons;

            dataSource.Where = @"Regex.IsMatch(Name,""^(?i)bob(by)?$"") and Id > 3";

            var config = new ParsingConfig {
                CustomTypeProvider = new DynamicLinqTypeProvider()
            };

            var result = dataSource.Select(config);

            Console.WriteLine(SerializeObject(result));
        }
コード例 #7
0
        public void DynamicExpressionParser_ParseLambda_UseParameterizedNamesInDynamicQuery_true()
        {
            // Assign
            var config = new ParsingConfig
            {
                UseParameterizedNamesInDynamicQuery = true
            };

            // Act
            var expression = DynamicExpressionParser.ParseLambda <string, bool>(config, true, "s => s == \"x\"");

            // Assert
            dynamic constantExpression = ((MemberExpression)(expression.Body as BinaryExpression).Right).Expression as ConstantExpression;
            dynamic wrappedObj         = constantExpression.Value;
            string  value = wrappedObj.Value;

            Check.That(value).IsEqualTo("x");
        }
コード例 #8
0
        public void FilterByLocalDate_WithDynamicExpressionParser()
        {
            // Arrange
            var config = new ParsingConfig
            {
                TypeConverters = new Dictionary <Type, TypeConverter>
                {
                    { typeof(LocalDate), new LocalDateConverter() }
                }
            };

            // Act
            var expr   = DynamicExpressionParser.ParseLambda <Entity, bool>(config, false, "BirthDate == @0", "1987-10-12");
            var result = entities.AsQueryable().Where(expr).ToList();

            // Assert
            Assert.Single(result);
        }
コード例 #9
0
        public void GetConverter_WithCustomConverer_ReturnsCorrectTypeConverter(Type type, Type expected)
        {
            // Arrange
            var parsingConfig = new ParsingConfig
            {
                TypeConverters = new Dictionary <Type, TypeConverter>
                {
                    { typeof(LocalDate), new LocalDateConverter() }
                }
            };
            var factory = new TypeConverterFactory(parsingConfig);

            // Act
            var typeConverter = factory.GetConverter(type);

            // Assert
            typeConverter.Should().BeOfType(expected);
        }
コード例 #10
0
        public void ParseLambda_CustomMethod()
        {
            // Assign
            var config = new ParsingConfig
            {
                CustomTypeProvider = new TestCustomTypeProvider()
            };

            var    context    = new CustomClassWithStaticMethod();
            string expression = $"{nameof(CustomClassWithStaticMethod)}.{nameof(CustomClassWithStaticMethod.GetAge)}(10)";

            // Act
            var      lambdaExpression = DynamicExpressionParser.ParseLambda(config, typeof(CustomClassWithStaticMethod), null, expression);
            Delegate del    = lambdaExpression.Compile();
            int      result = (int)del.DynamicInvoke(context);

            // Assert
            Check.That(result).IsEqualTo(10);
        }
コード例 #11
0
        public void ExpressionHelper_WrapNullableConstantExpression_false()
        {
            // Assign
            var config = new ParsingConfig
            {
                UseParameterizedNamesInDynamicQuery = false
            };
            var expressionHelper = new ExpressionHelper(config);

            int?       value      = 42;
            Expression expression = Expression.Constant(value);

            // Act
            expressionHelper.WrapConstantExpression(ref expression);

            // Assert
            Check.That(expression).IsInstanceOf <ConstantExpression>();
            Check.That(expression.ToString()).Equals("42");
        }
コード例 #12
0
        public void EvalDictionaryParams2()
        {
            object CreateDicParameter(string name) => new Dictionary <string, object>
            {
                { "Name", new Dictionary <string, object> {
                      { "FirstName", name }
                  } }
            };

            var config = new ParsingConfig()
            {
                CustomTypeProvider = new DefaultDynamicLinqCustomTypeProvider()
            };
            var parType = new Dictionary <string, object>().GetType();
            var lambda  = DynamicExpressionParser.ParseLambda(config, new [] { Expression.Parameter(parType, "item") }, typeof(object), "item.Name.FirstName").Compile();

            lambda.DynamicInvoke(CreateDicParameter("Julio")).Should().Be("Julio");
            lambda.DynamicInvoke(CreateDicParameter("John")).Should().Be("John");
        }
コード例 #13
0
        /// <summary>
        /// Simple example of parsing a dynamic expression with custom types.
        /// </summary>
        static void TestUnit1()
        {
            var data = new TestData();

            var config = new ParsingConfig {
                CustomTypeProvider = new DynamicLinqTypeProvider()
            };

            const string exp = @"Regex.IsMatch(Name,""^(?i)bob(by)?$"") and Id > 3";

            //Note that since we do not have a data source, dynamic linq makes this first WHERE parameter the IT instance
            var p = Expression.Parameter(typeof(Person), "bob");

            var e = DynamicExpressionParser.ParseLambda(config, new ParameterExpression[] { p }, typeof(bool), exp);

            var result = e.Compile().DynamicInvoke(data.Bob);

            Console.WriteLine(SerializeObject(result));
        }
コード例 #14
0
        public void DynamicExpressionParser_ParseLambda_ActionDelegate_VoidMethodCallExpression()
        {
            // Arrange
            var dataSource     = new MyClass();
            var expressionText = "it.Bar()";
            var parsingConfig  = new ParsingConfig {
                CustomTypeProvider = new MyClassCustomTypeProvider()
            };

            dataSource.Name.Should().BeNull();

            // Act
            LambdaExpression expression = DynamicExpressionParser.ParseLambda(typeof(Action <MyClass>), parsingConfig, dataSource.GetType(), null, expressionText);
            Delegate         del        = expression.Compile();

            del.DynamicInvoke(dataSource);

            // Assert
            dataSource.Name.Should().NotBeNullOrEmpty();
        }
コード例 #15
0
        public void DynamicExpressionParser_ParseLambda_UseParameterizedNamesInDynamicQuery_true()
        {
            // Assign
            var config = new ParsingConfig
            {
                UseParameterizedNamesInDynamicQuery = true
            };

            // Act
            var expression = DynamicExpressionParser.ParseLambda <string, bool>(config, true, "s => s == \"x\"");

            // Assert
            dynamic constantExpression = ((MemberExpression)(expression.Body as BinaryExpression).Right).Expression as ConstantExpression;
            dynamic wrappedObj         = constantExpression.Value;

            var    propertyInfo = wrappedObj.GetType().GetProperty("Value", BindingFlags.Instance | BindingFlags.Public);
            string value        = propertyInfo.GetValue(wrappedObj) as string;

            Check.That(value).IsEqualTo("x");
        }
コード例 #16
0
        public void Where_Dynamic_DateTimeIsParsedAsUTC(string time, int hours)
        {
            // Arrange
            var queryable = new List <Example> {
                new Example
                {
                    TimeNull = new DateTime(2019, 5, 10, hours, 3, 17, DateTimeKind.Utc)
                }
            }.AsQueryable();

            // Act
            var parsingConfig = new ParsingConfig
            {
                DateTimeIsParsedAsUTC = true
            };
            var result = queryable.Where(parsingConfig, $"it.TimeNull >= \"{time}\"");

            // Assert
            Assert.Equal(1, result.Count());
        }
コード例 #17
0
        public void Select_Dynamic_IntoTypeWithNullableProperties2()
        {
            // Arrange
            var dates = Enumerable.Repeat(0, 7)
                        .Select((d, i) => new DateTime(2000, 1, 1).AddDays(i).AddSeconds(i))
                        .AsQueryable();
            var config = new ParsingConfig {
                SupportEnumerationsFromSystemNamespace = false
            };

            // Act
            IQueryable <ExampleWithConstructor> result = dates
                                                         .Select(d => new ExampleWithConstructor(d, d.DayOfWeek, d.DayOfWeek, d.Second, d.Second));
            IQueryable <ExampleWithConstructor> resultDynamic = dates
                                                                .Select <ExampleWithConstructor>(config, "new (it as Time, DayOfWeek as DOWNull, DayOfWeek as DOW, Second as Sec, int?(Second) as SecNull)");

            // Assert
            Check.That(resultDynamic.First()).Equals(result.First());
            Check.That(resultDynamic.Last()).Equals(result.Last());
        }
コード例 #18
0
        public void ExpressionHelper_WrapNullableConstantExpression_true()
        {
            // Assign
            var config = new ParsingConfig
            {
                UseParameterizedNamesInDynamicQuery = true
            };
            var expressionHelper = new ExpressionHelper(config);

            int?       value      = 42;
            Expression expression = Expression.Constant(value);

            // Act
            expressionHelper.WrapConstantExpression(ref expression);
            expressionHelper.WrapConstantExpression(ref expression);

            // Assert
            Check.That(expression.GetType().FullName).Equals("System.Linq.Expressions.PropertyExpression");
            Check.That(expression.ToString()).Equals("value(System.Linq.Dynamic.Core.Parser.WrappedValue`1[System.Int32]).Value");
        }
コード例 #19
0
        public KeywordsHelper(ParsingConfig config)
        {
            if (config.AreContextKeywordsEnabled)
            {
                _keywords.Add(KEYWORD_IT, KEYWORD_IT);
                _keywords.Add(KEYWORD_PARENT, KEYWORD_PARENT);
                _keywords.Add(KEYWORD_ROOT, KEYWORD_ROOT);
            }

            _keywords.Add(SYMBOL_IT, SYMBOL_IT);
            _keywords.Add(SYMBOL_PARENT, SYMBOL_PARENT);
            _keywords.Add(SYMBOL_ROOT, SYMBOL_ROOT);

            _keywords.Add(FUNCTION_IIF, FUNCTION_IIF);
            _keywords.Add(FUNCTION_ISNULL, FUNCTION_ISNULL);
            _keywords.Add(FUNCTION_NEW, FUNCTION_NEW);
            _keywords.Add(FUNCTION_NULLPROPAGATION, FUNCTION_NULLPROPAGATION);
            _keywords.Add(FUNCTION_IS, FUNCTION_IS);
            _keywords.Add(FUNCTION_AS, FUNCTION_AS);
            _keywords.Add(FUNCTION_CAST, FUNCTION_CAST);

            foreach (Type type in PredefinedTypesHelper.PredefinedTypes.OrderBy(kvp => kvp.Value).Select(kvp => kvp.Key))
            {
                _keywords[type.FullName] = type;
                _keywords[type.Name]     = type;
            }

            foreach (KeyValuePair <string, Type> pair in PredefinedTypesHelper.PredefinedTypesShorthands)
            {
                _keywords.Add(pair.Key, pair.Value);
            }

            if (config.CustomTypeProvider != null)
            {
                foreach (Type type in config.CustomTypeProvider.GetCustomTypes())
                {
                    _keywords[type.FullName] = type;
                    _keywords[type.Name]     = type;
                }
            }
        }
コード例 #20
0
        internal override RuleFunc <RuleResultTree> BuildExpressionForRule(Rule rule, IEnumerable <ParameterExpression> typeParamExpressions)
        {
            try
            {
                var config = new ParsingConfig {
                    CustomTypeProvider = new CustomTypeProvider(_reSettings.CustomTypes)
                };
                var e            = DynamicExpressionParser.ParseLambda(config, true, typeParamExpressions.ToArray(), typeof(bool), rule.Expression);
                var ruleDelegate = e.Compile();
                bool func(object[] paramList) => (bool)ruleDelegate.DynamicInvoke(paramList);

                return(Helpers.ToResultTree(rule, null, func));
            }
            catch (Exception ex)
            {
                bool func(object[] param) => false;

                var exceptionMessage = ex.Message;
                return(Helpers.ToResultTree(rule, null, func, exceptionMessage));
            }
        }
        public void ParseLambda_CustomMethod()
        {
            var config = new ParsingConfig
            {
                CustomTypeProvider = new TestCustomTypeProvider()
            };

            var context  = new CustomClassWithStaticMethod();
            var original = $"{nameof(CustomClassWithStaticMethod)}.{nameof(CustomClassWithStaticMethod.GetAge)}(10)";
            int result   = 0;

            Check.ThatCode(() =>
            {
                var expression = System.Linq.Dynamic.Core.DynamicExpressionParser.ParseLambda(config, typeof(CustomClassWithStaticMethod), null, original);
                Delegate del   = expression.Compile();
                result         = (int)del.DynamicInvoke(context);
            })
            .DoesNotThrow();

            Check.That(result).IsEqualTo(10);
        }
コード例 #22
0
        public void Select_Dynamic_IntoKnownNestedType()
        {
            var config = new ParsingConfig {
                AllowNewToEvaluateAnyType = true
            };

#if NETCOREAPP
            // config.CustomTypeProvider = new NetStandardCustomTypeProvider();
#endif
            // Assign
            var queryable = new List <string>()
            {
                "name1", "name2"
            }.AsQueryable();

            // Act
            var projectedData = queryable.Select <Example.NestedDto>(config, $"new {typeof(Example.NestedDto).FullName}(~ as Name)");

            // Assert
            Check.That(projectedData.First().Name).Equals("name1");
            Check.That(projectedData.Last().Name).Equals("name2");
        }
        public void DynamicExpressionParser_ParseLambda_UseParameterizedNamesInDynamicQuery_true()
        {
            // Assign
            var config = new ParsingConfig
            {
                UseParameterizedNamesInDynamicQuery = true
            };

            // Act
            var    expression         = DynamicExpressionParser.ParseLambda <Person, bool>(config, false, "Id = 42");
            string expressionAsString = expression.ToString();

            // Assert
            Check.That(expressionAsString).IsEqualTo("Param_0 => (Param_0.Id == value(System.Linq.Dynamic.Core.Parser.WrappedValue`1[System.Int32]).Value)");

            dynamic constantExpression = ((MemberExpression)(expression.Body as BinaryExpression).Right).Expression as ConstantExpression;
            dynamic wrappedObj         = constantExpression.Value;

            var propertyInfo = wrappedObj.GetType().GetProperty("Value", BindingFlags.Instance | BindingFlags.Public);
            int value        = (int)propertyInfo.GetValue(wrappedObj);

            Check.That(value).IsEqualTo(42);
        }
コード例 #24
0
        private static void QueryCollection(Uri collectionUri, ParsingConfig config, string configName, string predicate, object[] parameters, string successOrFailure)
        {
            try
            {
                IQueryable <Entity> entities = _Client.CreateDocumentQuery <Entity>(collectionUri);

                IQueryable <Entity> results = entities.Where(config, predicate, parameters);

                string  querySqlJson       = results.AsDocumentQuery().ToString();
                JObject querySqlJsonObject = JObject.Parse(querySqlJson);
                string  querySql           = (string)querySqlJsonObject["query"];

                Console.WriteLine($"Config {configName} produces the following SQL:");
                Console.WriteLine();
                Console.WriteLine($"**** {querySql} ****");
                Console.WriteLine();
                Console.WriteLine($"This request will {successOrFailure}");
                Console.WriteLine();

                var querySqlSpec = new SqlQuerySpec(querySql);

                results = _Client.CreateDocumentQuery <Entity>(collectionUri, querySqlSpec, new FeedOptions()
                {
                    EnableCrossPartitionQuery = true
                });
                IList <Entity> output = results.ToList();

                Console.WriteLine($"Successfully returned {output.Count} entities");
                Console.WriteLine();
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Exception thrown: {ex.Message}");
                Console.WriteLine();
            }
            Console.WriteLine();
        }
        public static void Execute()
        {
            var externals = new Dictionary <string, object>
            {
                { "Users", false },
                { "x", new[] { "a", "b", "c" } },
                { "y", 2 },
            };

            //var t1 = Utils.ConvertToArray(null);

            //string query = "Utils.ConvertToArray()";
            //LambdaExpression expression = DynamicExpressionParser.ParseLambda(null, query, externals);
            //Delegate del = expression.Compile();
            //var result = del.DynamicInvoke();

            var config = new ParsingConfig();

            var list = new[] { new X {
                               }, new X {
                                   Values = new[] { "a", "b" }
                               } }.AsQueryable();
            var result = list.Select("Utils.ConvertToArray(Values)").ToDynamicList <string[]>();
        }
コード例 #26
0
        /// <summary>
        ///
        /// </summary>
        public static void AssertExpTextCanBeConvertedToLambda <TResult>(
            this ExpressionText expText)
        {
            ParsingConfig pc = ParsingConfig.Default;

            pc.AllowNewToEvaluateAnyType = true;
            pc.CustomTypeProvider        = new CustomTypeProvider();

            // Build the parameters...
            List <ParameterExpression> parameters = new List <ParameterExpression>();

            foreach (var p in expText.Parameters2.Values)
            {
                parameters.Add(p);
            }

            DynamicExpressionParser.ParseLambda(
                pc,
                true,
                parameters.ToArray(),
                typeof(TResult),
                expText.Expression,
                new object[] { expText.Arguments });
        }
        public void Is_Dynamic_ActingOnIt_WithSimpleName()
        {
            // Assign
            var config = new ParsingConfig
            {
                ResolveTypesBySimpleName = true
            };

            var qry = new BaseEmployee[]
            {
                new Worker {
                    Name = "1"
                }, new Boss {
                    Name = "b"
                }
            }.AsQueryable();

            // Act
            int countOfType        = qry.Count(c => c is Worker);
            int countOfTypeDynamic = qry.Count(config, "is(\"Worker\")");

            // Assert
            Check.That(countOfTypeDynamic).Equals(countOfType);
        }
コード例 #28
0
 public ProjectCommitParser(ParsingConfig parsingConfig) : base(parsingConfig)
 {
 }
コード例 #29
0
 /// <summary>
 /// Initializes a new instance of the <see cref="NumberParser"/> class.
 /// </summary>
 /// <param name="config">The ParsingConfig.</param>
 public NumberParser(ParsingConfig config)
 {
     _config = config;
 }
コード例 #30
0
        internal ExpressionHelper([NotNull] ParsingConfig parsingConfig)
        {
            Check.NotNull(parsingConfig, nameof(parsingConfig));

            _parsingConfig = parsingConfig;
        }