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); }
public void AggregateExpressionsIntoTuple_OneExpression() { var expression1 = Expression.Constant("expr1"); var tupleExpression = TupleExpressionBuilder.AggregateExpressionsIntoTuple(new[] { expression1 }); Assert.That(tupleExpression, Is.SameAs(expression1)); }
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)); }
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)); }
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); }
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); }
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"))); }
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"))); }