Ejemplo n.º 1
0
 internal virtual SqlExpression VisitClientArray(SqlClientArray scar) {
     for (int i = 0, n = scar.Expressions.Count; i < n; i++) {
         scar.Expressions[i] = this.VisitExpression(scar.Expressions[i]);
     }
     return scar;
 }
Ejemplo n.º 2
0
		private SqlNode VisitInvocation(InvocationExpression invoke)
		{
			LambdaExpression lambda =
				(invoke.Expression.NodeType == ExpressionType.Quote)
					? (LambdaExpression)((UnaryExpression)invoke.Expression).Operand
					: (invoke.Expression as LambdaExpression);
			if(lambda != null)
			{
				// just map arg values into lambda's parameters and evaluate lambda's body
				for(int i = 0, n = invoke.Arguments.Count; i < n; i++)
				{
					_parameterExpressionToExpression[lambda.Parameters[i]] = invoke.Arguments[i];
				}
				return this.VisitInner(lambda.Body);
			}
			else
			{
				// check for compiled query invocation
				SqlExpression expr = this.VisitExpression(invoke.Expression);
				if(expr.NodeType == SqlNodeType.Value)
				{
					SqlValue value = (SqlValue)expr;
					Delegate d = value.Value as Delegate;
					if(d != null)
					{
						CompiledQuery cq = d.Target as CompiledQuery;
						if(cq != null)
						{
							return this.VisitInvocation(Expression.Invoke(cq.Expression, invoke.Arguments));
						}
						else if(invoke.Arguments.Count == 0)
						{
							object invokeResult;
							try
							{
								invokeResult = d.DynamicInvoke(null);
							}
							catch(System.Reflection.TargetInvocationException e)
							{
								throw e.InnerException;
							}
							return _nodeFactory.ValueFromObject(invokeResult, invoke.Type, true, _dominatingExpression);
						}
					}
				}
				SqlExpression[] args = new SqlExpression[invoke.Arguments.Count];
				for(int i = 0; i < args.Length; ++i)
				{
					args[i] = (SqlExpression)this.Visit(invoke.Arguments[i]);
				}
				var sca = new SqlClientArray(typeof(object[]), _typeProvider.From(typeof(object[])), args, _dominatingExpression);
				return _nodeFactory.MethodCall(invoke.Type, typeof(Delegate).GetMethod("DynamicInvoke"), expr, new SqlExpression[] { sca }, _dominatingExpression);
			}
		}
Ejemplo n.º 3
0
		internal override SqlExpression VisitClientArray(SqlClientArray scar)
		{
			if(!_isDebugMode)
			{
				throw Error.InvalidFormatNode("ClientArray");
			}
			_commandStringBuilder.Append("new []{");
			for(int i = 0, n = scar.Expressions.Count; i < n; i++)
			{
				if(i > 0) _commandStringBuilder.Append(", ");
				this.Visit(scar.Expressions[i]);
			}
			_commandStringBuilder.Append("}");
			return scar;
		}
Ejemplo n.º 4
0
		private Type GenerateClientArray(SqlClientArray ca)
		{
			if(!ca.ClrType.IsArray)
			{
				throw Error.CannotMaterializeList(ca.ClrType);
			}
			Type elemType = TypeSystem.GetElementType(ca.ClrType);
			this.GenerateConstInt(ca.Expressions.Count);
			gen.Emit(OpCodes.Newarr, elemType);
			for(int i = 0, n = ca.Expressions.Count; i < n; i++)
			{
				gen.Emit(OpCodes.Dup);
				this.GenerateConstInt(i);
				this.GenerateExpressionForType(ca.Expressions[i], elemType);
				this.GenerateArrayAssign(elemType);
			}
			return ca.ClrType;
		}
Ejemplo n.º 5
0
		internal override SqlExpression VisitClientArray(SqlClientArray scar)
		{
			SqlExpression[] exprs = new SqlExpression[scar.Expressions.Count];
			for(int i = 0, n = exprs.Length; i < n; i++)
			{
				exprs[i] = this.VisitExpression(scar.Expressions[i]);
			}
			return new SqlClientArray(scar.ClrType, scar.SqlType, exprs, scar.SourceExpression);
		}