protected virtual void AddParameter(StringBuilder sb, string name, object value, Type type, QueryParameter data = null) { // Is this an enumerable type that needs to be split into separate variables? bool isEnumerable = typeof(IEnumerable).IsAssignableFrom(type) && type != typeof(String); if (isEnumerable) { sb.Append("("); } if (isEnumerable && value != null) { // If the value is enumerable int i = 0; foreach (object val in (IEnumerable)value) { string paramName = String.IsNullOrEmpty(name) ? DataMapper.ParamName(Parameters.Count, true) : DataMapper.ParamName(String.Format("{0}{1}", name, i)); if (++i > 1) { sb.Append(","); } sb.Append(paramName); Parameters.Add(paramName, new QueryParameter { Value = val }); } } else { if (data != null && value != null && !String.IsNullOrEmpty(data.AppendStart) && value.GetType() == typeof(String)) { value = String.Format("{0}{1}", data.AppendStart, value); } if (data != null && value != null && !String.IsNullOrEmpty(data.AppendEnd) && value.GetType() == typeof(String)) { value = String.Format("{0}{1}", value, data.AppendEnd); } string paramName = String.IsNullOrEmpty(name) ? DataMapper.ParamName(Parameters.Count, true) : DataMapper.ParamName(name); sb.Append(paramName); if (data == null) { data = new QueryParameter { Value = value } } ; else { data.Value = value; } Parameters.Add(paramName, data); } if (isEnumerable) { sb.Append(")"); } }
/// <summary> /// Replace a parameter when a compiled query is executed. /// </summary> /// <param name="number"></param> /// <param name="value"></param> /// <returns></returns> protected QueryBuilder <T> ReplaceParameter(string name, object value) { if (value is IEnumerable && value.GetType() != typeof(String)) { StringBuilder sb = new StringBuilder(); int i = 0; foreach (object val in (IEnumerable)value) { string paramName = DataMapper.ParamName(String.Format("{0}{1}", name, i++)); if (i > 1) { sb.Append(","); } sb.Append(paramName); // Add or replace the new parameter. if (Parameters.ContainsKey(paramName)) { Parameters[paramName].Value = val; } else { Parameters.Add(paramName, new QueryParameter { Value = val }); } } string baseParamName = DataMapper.ParamName(name); if (Parameters.ContainsKey(baseParamName)) { // Replace the single parameter in the WHERE and UPDATE clauses with the parameter list. this.WhereStr.Replace(baseParamName, sb.ToString()); this.UpdateStr.Replace(baseParamName, sb.ToString()); // Remove the single placeholder parameter. Parameters.Remove(baseParamName); } } else { string paramName = DataMapper.ParamName(name); if (Parameters.ContainsKey(paramName)) { QueryParameter parameter = Parameters[paramName]; if (value != null && !String.IsNullOrEmpty(parameter.AppendStart) && value.GetType() == typeof(String)) { value = String.Format("{0}{1}", parameter.AppendStart, value); } if (value != null && !String.IsNullOrEmpty(parameter.AppendEnd) && value.GetType() == typeof(String)) { value = String.Format("{0}{1}", value, parameter.AppendEnd); } parameter.Value = value; } } return(this); }
public QueryBuilder() { Mapping = DataMapper.GetTableMapping(typeof(T)); this.SelectStr = Mapping.SelectExpression; }
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))); }
public virtual int ExecuteNonQuery() { return(DataMapper.NonQuery(SessionFactory.GetCurrentSession(typeof(T)), 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); }
/// <summary> /// Gets the database session key for the specified entity type. /// </summary> /// <param name="entityType"></param> /// <returns></returns> internal static string GetSessionKey(Type entityType) { TableMapping mapping = DataMapper.GetTableMapping(entityType); return((mapping == null) ? null : mapping.Key); }