public int ExecuteNonQuery(ActionContext context) { ITable table = null; Expression expr = DbCommandActionHelper.GetEnumeratorExpression(this.commandTree.Predicate, this.commandTree, context.DbContainer, out table); IQueryable entitiesToUpdate = DatabaseReflectionHelper.CreateTableQuery(expr, context.DbContainer.Internal); Type type = TypeHelper.GetElementType(table.GetType()); // Collect the SetClause DbExpressions into a dictionary IDictionary <string, DbExpression> setClauses = DbCommandActionHelper.GetSetClauseExpressions(this.commandTree.SetClauses); // Collection for collection member bindings IList <MemberBinding> memberBindings = new List <MemberBinding>(); TransformVisitor transform = new TransformVisitor(context.DbContainer.TypeConverter); // Setup context for the predicate ParameterExpression param = Expression.Parameter(type, "context"); using (transform.CreateVariable(param, this.commandTree.Target.VariableName)) { // Initialize member bindings foreach (PropertyInfo property in type.GetProperties()) { Expression setter = null; // Check if member has set clause if (setClauses.ContainsKey(property.Name)) { setter = transform.Visit(setClauses[property.Name]); } // If setter was found, insert it if (setter != null) { // Type correction setter = ExpressionHelper.CorrectType(setter, property.PropertyType); memberBindings.Add(Expression.Bind(property, setter)); } } } Expression updater = Expression.Lambda( Expression.MemberInit(Expression.New(type), memberBindings), param); return(DatabaseReflectionHelper.UpdateEntities(entitiesToUpdate, updater, context.Transaction).Count()); }
public static Expression GetEnumeratorExpression( DbExpression predicate, DbModificationCommandTree commandTree, DbContainer container, out ITable table) { TransformVisitor visitor = new TransformVisitor(container.TypeConverter); visitor.TableProvider = container; // Get the source expression ConstantExpression source = visitor.Visit(commandTree.Target.Expression) as ConstantExpression; // This should be a constant expression if (source == null) { throw new InvalidOperationException(); } table = source.Value as ITable; // Get the the type of the elements of the table Type elementType = TypeHelper.GetElementType(source.Type); // Create context ParameterExpression context = Expression.Parameter(elementType, "context"); using (visitor.CreateVariable(context, commandTree.Target.VariableName)) { // Create the predicate expression LambdaExpression predicateExpression = Expression.Lambda( visitor.Visit(predicate), context); // Create Where expression LinqMethodExpressionBuilder queryMethodBuilder = new LinqMethodExpressionBuilder(); return(queryMethodBuilder.Where(source, predicateExpression)); } }
public DbDataReader ExecuteDataReader(ActionContext context) { FieldDescription[] returningFields = DbCommandActionHelper.GetReturningFields(this.commandTree.Returning); IList <IDictionary <string, object> > returningEntities = new List <IDictionary <string, object> >(); ITable table = null; Expression expr = DbCommandActionHelper.GetEnumeratorExpression(this.commandTree.Predicate, this.commandTree, context.DbContainer, out table); IQueryable entitiesToUpdate = DatabaseReflectionHelper.CreateTableQuery(expr, context.DbContainer.Internal); Type type = TypeHelper.GetElementType(table.GetType()); // Collect the SetClause DbExpressions into a dictionary IDictionary <string, DbExpression> setClauses = DbCommandActionHelper.GetSetClauseExpressions(this.commandTree.SetClauses); // Collection for collection member bindings IList <MemberBinding> memberBindings = new List <MemberBinding>(); TransformVisitor transform = new TransformVisitor(context.DbContainer); // Setup context for the predicate ParameterExpression param = Expression.Parameter(type, "context"); using (transform.CreateVariable(param, this.commandTree.Target.VariableName)) { // Initialize member bindings foreach (PropertyInfo property in type.GetProperties()) { Expression setter = null; // Check if member has set clause if (setClauses.ContainsKey(property.Name)) { setter = transform.Visit(setClauses[property.Name]); } // If setter was found, insert it if (setter != null) { // Type correction setter = ExpressionHelper.CorrectType(setter, property.PropertyType); memberBindings.Add(Expression.Bind(property, setter)); } } } Expression updater = Expression.Lambda( Expression.MemberInit(Expression.New(type), memberBindings), param); IEnumerable <object> updatedEntities = DatabaseReflectionHelper.UpdateEntities(entitiesToUpdate, updater, context.Transaction); int affectedRecords = 0; foreach (object entity in updatedEntities) { affectedRecords++; Dictionary <string, object> returningEntity = DbCommandActionHelper.CreateReturningEntity(context, returningFields, entity); returningEntities.Add(returningEntity); } return(new EffortDataReader( returningEntities, affectedRecords, returningFields, context.DbContainer)); }