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; }
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); } }
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; }
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; }
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); }