protected virtual Expression VisitMemberAccess(MemberExpression m, StringBuilder sb, QueryParameter data = null) { if (m.Expression == null) { this.VisitConstant(Expression.Constant(Expression.Lambda(m).Compile().DynamicInvoke(null)), sb, data); return(m); } switch (m.Expression.NodeType) { case ExpressionType.Parameter: sb.Append(DataMapper.EscapeName(DataMapper.GetColumnName(typeof(T), m.Member.Name))); break; case ExpressionType.Constant: if (m.Member.MemberType == MemberTypes.Field) { AddParameter(sb, m.Member.Name, ((FieldInfo)m.Member).GetValue(((ConstantExpression)m.Expression).Value), ((FieldInfo)m.Member).FieldType, data); } else { AddParameter(sb, m.Member.Name, ((PropertyInfo)m.Member).GetValue(((ConstantExpression)m.Expression).Value), ((PropertyInfo)m.Member).PropertyType, data); } break; case ExpressionType.MemberAccess: this.VisitConstant(Expression.Constant(Expression.Lambda(m).Compile().DynamicInvoke(null)), sb, data); break; default: throw new NotSupportedException(string.Format("The member '{0}' is not supported", m.Member.Name)); } return(m); }
public void GenerateUpdateExpression() { StringBuilder columnStr = new StringBuilder(); StringBuilder whereStr = new StringBuilder(); int i = 0; foreach (ColumnMapping column in Columns) { if (column.IsPk || column.IsPartitionKey) { if (whereStr.Length > 0) { whereStr.Append(" AND "); } whereStr.Append(String.Format("{0} = {1}", DataMapper.EscapeName(column.ColumnName), DataMapper.ParamName(i++))); } else { columnStr.Append(String.Format("{0} = {1},", DataMapper.EscapeName(column.ColumnName), DataMapper.ParamName(i++))); } } this.UpdateExpression = String.Format("UPDATE {0} SET {1} WHERE {2};", DataMapper.EscapeName(this.TableName), columnStr.ToString().TrimEnd(new char[] { ',' }), whereStr.ToString()); }
public QueryBuilder <T> OrderBy <TKey>(Expression <Func <T, TKey> > keySelector) { if (this.OrderByStr.Length > 0) { this.OrderByStr.Append(", "); } this.OrderByStr.Append(DataMapper.EscapeName(DataMapper.GetColumnName(typeof(T), ((MemberExpression)keySelector.Body).Member.Name))); return(this); }
public void GenerateSelectExpression() { StringBuilder columnStr = new StringBuilder(); StringBuilder whereStr = new StringBuilder(); foreach (ColumnMapping column in Columns) { columnStr.Append(String.Format("{0},", DataMapper.EscapeName(column.ColumnName))); } this.SelectExpression = String.Format("SELECT {0} FROM {1}", columnStr.ToString().TrimEnd(new char[] { ',' }), DataMapper.EscapeName(this.TableName)); }
public virtual QueryBuilder <T> ById(object id) { if (Mapping.Columns.Where(c => c.IsPk).Count() > 1) { throw new NotSupportedException("QueryBuilder.ById is not supported for tables with multiple PK columns."); } ColumnMapping pk = Mapping.Columns.FirstOrDefault(c => c.IsPk); WhereStr.Append(DataMapper.EscapeName(pk.ColumnName)).Append(" = "); AddParameter(WhereStr, "pk", id, id.GetType()); return(this); }
public virtual QueryBuilder <T> Update(string propertyName, object value) { this.isUpdate = true; if (this.UpdateStr.Length > 0) { this.UpdateStr.Append(", "); } this.UpdateStr.Append(String.Format("{0} = ", DataMapper.EscapeName(DataMapper.GetColumnName(typeof(T), propertyName)))); this.AddParameter(this.UpdateStr, null, value, value.GetType()); return(this); }
public virtual QueryBuilder <T> Update <TKey>(string propertyName, Expression <Func <T, TKey> > expr) { this.isUpdate = true; if (this.UpdateStr.Length > 0) { this.UpdateStr.Append(", "); } this.UpdateStr.Append(String.Format("{0} = ", DataMapper.EscapeName(DataMapper.GetColumnName(typeof(T), propertyName)))); this.Visit(expr, this.UpdateStr); return(this); }
public virtual QueryBuilder <T> Increment <TKey>(Expression <Func <T, TKey> > keySelector, object amount) { this.isUpdate = true; if (this.UpdateStr.Length > 0) { this.UpdateStr.Append(", "); } this.UpdateStr.Append(String.Format("{0} = {0} + ", DataMapper.EscapeName(DataMapper.GetColumnName(typeof(T), ((MemberExpression)keySelector.Body).Member.Name)))); this.AddParameter(this.UpdateStr, null, amount, amount.GetType()); return(this); }
public void GenerateDeleteExpression() { StringBuilder whereStr = new StringBuilder(); int i = 0; foreach (ColumnMapping column in Columns.Where(c => c.IsPk)) { if (whereStr.Length > 0) { whereStr.Append(" AND "); } whereStr.Append(String.Format("{0} = {1}", DataMapper.EscapeName(column.ColumnName), DataMapper.ParamName(i++))); } this.DeleteExpression = String.Format("DELETE FROM {0} WHERE {1};", DataMapper.EscapeName(this.TableName), whereStr.ToString()); }
public void GenerateGetExpression() { StringBuilder whereStr = new StringBuilder(); int i = 0; foreach (ColumnMapping column in Columns) { if (column.IsPk || column.IsPartitionKey) { if (whereStr.Length > 0) { whereStr.Append(" AND "); } whereStr.Append(String.Format("{0} = {1}", DataMapper.EscapeName(column.ColumnName), DataMapper.ParamName(column.IsPk ? String.Format("_id{0}", i++) : "ts"))); } } this.GetExpression = String.Format("{0} WHERE {1}", this.SelectExpression, whereStr.ToString()); }
public void GenerateInsertExpression() { StringBuilder columnStr = new StringBuilder(); StringBuilder valueStr = new StringBuilder(); int i = 0; foreach (ColumnMapping column in Columns) { if (SessionFactory.Provider == DataProvider.MySql && column.IsAutoGenerated) { continue; } columnStr.Append(String.Format("{0},", DataMapper.EscapeName(column.ColumnName))); valueStr.Append(String.Format("{0},", DataMapper.ParamName(i++))); } this.InsertExpression = String.Format("INSERT INTO {0} ({1}) VALUES ({2});", DataMapper.EscapeName(this.TableName), columnStr.ToString().TrimEnd(new char[] { ',' }), valueStr.ToString().TrimEnd(new char[] { ',' })); }
public override string ToString() { StringBuilder query = new StringBuilder((this.isUpdate) ? String.Format("UPDATE {0}", DataMapper.EscapeName(this.Mapping.TableName)) : this.SelectStr); if (this.UpdateStr.Length > 0) { query.Append(" SET ").Append(this.UpdateStr.ToString()); } if (this.WhereStr.Length > 0) { query.Append(" WHERE ").Append(this.WhereStr.ToString()); } if (this.OrderByStr.Length > 0) { query.Append(" ORDER BY ").Append(this.OrderByStr.ToString()); } if (this.SkipRows > 0) { query.Append(" OFFSET ").Append(this.SkipRows); } if (this.Limit > 0) { query.Append(" LIMIT ").Append(this.Limit); } return(query.ToString()); }
public virtual int Count() { this.SelectStr = String.Format("SELECT COUNT(*) FROM {0}", DataMapper.EscapeName(Mapping.TableName)); return(Convert.ToInt32(DataMapper.SelectScalar(SessionFactory.GetCurrentSession(typeof(T)), this))); }