public virtual int Update <TEntity>(Expression <Func <TEntity, bool> > condition, Expression <Func <TEntity, TEntity> > content, string table, int limits) { Utils.CheckNull(condition); Utils.CheckNull(content); TypeDescriptor typeDescriptor = EntityTypeContainer.GetDescriptor(typeof(TEntity)); Dictionary <MemberInfo, Expression> updateColumns = InitMemberExtractor.Extract(content); DbTable explicitDbTable = null; if (table != null) { explicitDbTable = new DbTable(table, typeDescriptor.Table.Schema); } DefaultExpressionParser expressionParser = typeDescriptor.GetExpressionParser(explicitDbTable); DbExpression conditionExp = expressionParser.ParseFilterPredicate(condition); MySqlDbUpdateExpression e = new MySqlDbUpdateExpression(explicitDbTable ?? typeDescriptor.Table, conditionExp); foreach (var kv in updateColumns) { MemberInfo key = kv.Key; PropertyDescriptor propertyDescriptor = typeDescriptor.TryGetPropertyDescriptor(key); if (propertyDescriptor == null) { throw new ChloeException(string.Format("The member '{0}' does not map any column.", key.Name)); } if (propertyDescriptor.IsPrimaryKey) { throw new ChloeException(string.Format("Could not update the primary key '{0}'.", propertyDescriptor.Column.Name)); } if (propertyDescriptor.IsAutoIncrement) { throw new ChloeException(string.Format("Could not update the identity column '{0}'.", propertyDescriptor.Column.Name)); } e.UpdateColumns.Add(propertyDescriptor.Column, expressionParser.Parse(kv.Value)); } e.Limits = limits; if (e.UpdateColumns.Count == 0) { return(0); } return(this.ExecuteSqlCommand(e)); }
public override DbExpression Visit(DbUpdateExpression exp) { if (!(exp is MySqlDbUpdateExpression)) { return(base.Visit(exp)); } MySqlDbUpdateExpression ret = new MySqlDbUpdateExpression(exp.Table, this.MakeNewExpression(exp.Condition)); foreach (var kv in exp.UpdateColumns) { ret.UpdateColumns.Add(kv.Key, this.MakeNewExpression(kv.Value)); } ret.Limits = (exp as MySqlDbUpdateExpression).Limits; return(ret); }
public virtual int Update <TEntity>(Expression <Func <TEntity, bool> > condition, Expression <Func <TEntity, TEntity> > content, string table, int limits) { PublicHelper.CheckNull(condition); PublicHelper.CheckNull(content); TypeDescriptor typeDescriptor = EntityTypeContainer.GetDescriptor(typeof(TEntity)); Dictionary <MemberInfo, Expression> updateColumns = InitMemberExtractor.Extract(content); DbTable dbTable = PublicHelper.CreateDbTable(typeDescriptor, table); DefaultExpressionParser expressionParser = typeDescriptor.GetExpressionParser(dbTable); DbExpression conditionExp = expressionParser.ParseFilterPredicate(condition); MySqlDbUpdateExpression e = new MySqlDbUpdateExpression(dbTable, conditionExp); foreach (var kv in updateColumns) { MemberInfo key = kv.Key; PrimitivePropertyDescriptor propertyDescriptor = typeDescriptor.GetPrimitivePropertyDescriptor(key); if (propertyDescriptor.IsPrimaryKey) { throw new ChloeException(string.Format("Could not update the primary key '{0}'.", propertyDescriptor.Column.Name)); } if (propertyDescriptor.IsAutoIncrement) { throw new ChloeException(string.Format("Could not update the identity column '{0}'.", propertyDescriptor.Column.Name)); } e.UpdateColumns.Add(propertyDescriptor.Column, expressionParser.Parse(kv.Value)); } e.Limits = limits; if (e.UpdateColumns.Count == 0) { return(0); } return(this.ExecuteNonQuery(e)); }