Пример #1
0
        public void AggregateExpressionsIntoTuple_ThreeeExpressions()
        {
            var expression1 = Expression.Constant("expr1");
            var expression2 = Expression.Constant("expr2");
            var expression3 = Expression.Constant("expr3");

            var result = TupleExpressionBuilder.AggregateExpressionsIntoTuple(new[] { expression1, expression2, expression3 });

            var innerTupleCtor = typeof(KeyValuePair <string, string>).GetConstructor(new[] { typeof(string), typeof(string) });
            var outerTupleCtor =
                typeof(KeyValuePair <string, KeyValuePair <string, string> >).GetConstructor(
                    new[] { typeof(string), typeof(KeyValuePair <string, string>) });

            var innerTupleKeyGetter   = innerTupleCtor.DeclaringType.GetMethod("get_Key");
            var innerTupleValueGetter = innerTupleCtor.DeclaringType.GetMethod("get_Value");
            var outerTupleKeyGetter   = outerTupleCtor.DeclaringType.GetMethod("get_Key");
            var outerTupleValueGetter = outerTupleCtor.DeclaringType.GetMethod("get_Value");

            var expectedResult = Expression.New(
                outerTupleCtor,
                new Expression[]
            {
                expression1,
                Expression.New(innerTupleCtor, new[] { expression2, expression3 }, innerTupleKeyGetter, innerTupleValueGetter)
            },
                outerTupleKeyGetter,
                outerTupleValueGetter);

            ExpressionTreeComparer.CheckAreEqualTrees(result, expectedResult);
        }
Пример #2
0
        public void AggregateExpressionsIntoTuple_OneExpression()
        {
            var expression1     = Expression.Constant("expr1");
            var tupleExpression = TupleExpressionBuilder.AggregateExpressionsIntoTuple(new[] { expression1 });

            Assert.That(tupleExpression, Is.SameAs(expression1));
        }
Пример #3
0
        public void GetExpressionsFromTuple_OneExpression()
        {
            var expression = Expression.Constant("expr1");

            var result = TupleExpressionBuilder.GetExpressionsFromTuple(expression);

            var enumerator = result.GetEnumerator();

            enumerator.MoveNext();
            Assert.That(enumerator.Current, Is.SameAs(expression));
        }
Пример #4
0
        private FromExpressionInfo GetFromExpressionInfoForSubStatement(SqlStatement originalSqlStatement, SqlTable tableWithSubStatement)
        {
            var expressionsFromSubStatement =
                TupleExpressionBuilder.GetExpressionsFromTuple(new SqlTableReferenceExpression(tableWithSubStatement)).ToArray();

            var projectionFromSubStatement = expressionsFromSubStatement.First(); // this was the original projection
            var orderingsFromSubStatement  = expressionsFromSubStatement
                                             .Skip(1)                             // ignore original projection
                                             .Select((expr, i) => new Ordering(expr, originalSqlStatement.Orderings[i].OrderingDirection));

            return(new FromExpressionInfo(tableWithSubStatement, orderingsFromSubStatement.ToArray(), projectionFromSubStatement, null));
        }
Пример #5
0
        private Expression GetNewSelectExpressionWithOrderings(SqlStatement sqlStatement)
        {
            // wrap original select projection and all orderings into a large tuple expression (new { proj, new { o1, new { o2, ... }}})
            var expressionsToBeTupelized = new[] { sqlStatement.SelectProjection }.Concat(sqlStatement.Orderings.Select(o => o.Expression));
            var tupleExpression = TupleExpressionBuilder.AggregateExpressionsIntoTuple(expressionsToBeTupelized);

            var preparedTupleExpression = _stage.PrepareSelectExpression(tupleExpression, _context);

            if (preparedTupleExpression.Type != tupleExpression.Type)
            {
                throw new InvalidOperationException("The SQL Preparation stage must not change the type of the select projection.");
            }

            return(preparedTupleExpression);
        }
Пример #6
0
        public void AggregateExpressionsIntoTuple_TwoExpressions()
        {
            var expression1 = Expression.Constant("expr1");
            var expression2 = Expression.Constant("expr2");

            var result = TupleExpressionBuilder.AggregateExpressionsIntoTuple(new[] { expression1, expression2 });

            var tupleCtor      = typeof(KeyValuePair <string, string>).GetConstructor(new[] { typeof(string), typeof(string) });
            var expectedResult = Expression.New(
                tupleCtor,
                new[] { expression1, expression2 },
                tupleCtor.DeclaringType.GetMethod("get_Key"),
                tupleCtor.DeclaringType.GetMethod("get_Value"));

            ExpressionTreeComparer.CheckAreEqualTrees(result, expectedResult);
        }
Пример #7
0
        public void GetExpressionsFromTuple_ThreeExpressions()
        {
            var expression1 = Expression.Constant("expr1");
            var expression2 = Expression.Constant("expr2");
            var expression3 = Expression.Constant("expr3");

            var innerTupleCtor = typeof(KeyValuePair <string, string>).GetConstructor(new[] { typeof(string), typeof(string) });
            var outerTupleCtor =
                typeof(KeyValuePair <string, KeyValuePair <string, string> >).GetConstructor(
                    new[] { typeof(string), typeof(KeyValuePair <string, string>) });

            var innerTupleKeyGetter   = innerTupleCtor.DeclaringType.GetMethod("get_Key");
            var innerTupleValueGetter = innerTupleCtor.DeclaringType.GetMethod("get_Value");
            var outerTupleKeyGetter   = outerTupleCtor.DeclaringType.GetMethod("get_Key");
            var outerTupleValueGetter = outerTupleCtor.DeclaringType.GetMethod("get_Value");

            var tupleExpression = Expression.New(
                outerTupleCtor,
                new Expression[]
            {
                expression1,
                Expression.New(innerTupleCtor, new[] { expression2, expression3 }, innerTupleKeyGetter, innerTupleValueGetter)
            },
                outerTupleKeyGetter,
                outerTupleValueGetter);

            var result = TupleExpressionBuilder.GetExpressionsFromTuple(tupleExpression);

            var enumerator = result.GetEnumerator();

            enumerator.MoveNext();
            ExpressionTreeComparer.CheckAreEqualTrees(
                enumerator.Current, MemberExpression.MakeMemberAccess(tupleExpression, outerTupleCtor.DeclaringType.GetProperty("Key")));
            enumerator.MoveNext();
            ExpressionTreeComparer.CheckAreEqualTrees(
                enumerator.Current,
                MemberExpression.MakeMemberAccess(
                    MemberExpression.MakeMemberAccess(tupleExpression, outerTupleCtor.DeclaringType.GetProperty("Value")),
                    innerTupleCtor.DeclaringType.GetProperty("Key")));
            enumerator.MoveNext();
            ExpressionTreeComparer.CheckAreEqualTrees(
                enumerator.Current,
                MemberExpression.MakeMemberAccess(
                    MemberExpression.MakeMemberAccess(tupleExpression, outerTupleCtor.DeclaringType.GetProperty("Value")),
                    innerTupleCtor.DeclaringType.GetProperty("Value")));
        }
Пример #8
0
        public void GetExpressionsFromTuple_TwoExpressions()
        {
            var expression1     = Expression.Constant("expr1");
            var expression2     = Expression.Constant("expr2");
            var tupleCtor       = typeof(KeyValuePair <string, string>).GetConstructor(new[] { typeof(string), typeof(string) });
            var tupleExpression = Expression.New(
                tupleCtor,
                new[] { expression1, expression2 },
                tupleCtor.DeclaringType.GetMethod("get_Key"),
                tupleCtor.DeclaringType.GetMethod("get_Value"));

            var result = TupleExpressionBuilder.GetExpressionsFromTuple(tupleExpression);

            var enumerator = result.GetEnumerator();

            enumerator.MoveNext();
            ExpressionTreeComparer.CheckAreEqualTrees(
                enumerator.Current, MemberExpression.MakeMemberAccess(tupleExpression, tupleCtor.DeclaringType.GetProperty("Key")));
            enumerator.MoveNext();
            ExpressionTreeComparer.CheckAreEqualTrees(
                enumerator.Current, MemberExpression.MakeMemberAccess(tupleExpression, tupleCtor.DeclaringType.GetProperty("Value")));
        }