/// <summary> /// Builds the WHERE clause from the given expression object. /// </summary> /// <param name="expression">The expression object.</param> /// <returns>The <c>Apworks.Storage.Builders.WhereClauseBuildResult</c> instance /// which contains the build result.</returns> public WhereClauseBuildResult BuildWhereClause(Expression <Func <TEntity, bool> > expression) { this.sb.Clear(); this.parameterValues.Clear(); this.Visit(expression.Body); WhereClauseBuildResult result = new WhereClauseBuildResult { ParameterValues = parameterValues, WhereClause = sb.ToString() }; return(result); }
protected Tuple <string, IEnumerable <Tuple <string, string, object> >, WhereClauseBuildResult> ConstructUpdateStatement(TEntity entity, Expression <Func <TEntity, bool> > expression, IEnumerable <Expression <Func <TEntity, object> > > updateFields) { var sqlBuilder = new StringBuilder($"UPDATE {mapping.GetEscapedTableName<TEntity, TKey>(dialectSettings)} SET "); var columnNames = new List <Tuple <string, string, object> >(); var updateProperties = typeof(TEntity) .GetTypeInfo() .GetProperties(BindingFlags.Public | BindingFlags.Instance) .Where(p => p.CanRead && p.PropertyType.IsSimpleType()); if (updateFields != null) { updateProperties = updateProperties.Where(p => updateFields.Any(expr => ((MemberExpression)StripConvert(expr).Body).Member.Name == p.Name)); } updateProperties .ToList() .ForEach(ps => { columnNames.Add(new Tuple <string, string, object>(mapping.GetEscapedColumnName <TEntity, TKey>(dialectSettings, ps), $"{this.dialectSettings.ParameterChar}{ps.Name}", ps.GetValue(entity) ?? DBNull.Value)); }); for (var i = 0; i < columnNames.Count; i++) { sqlBuilder.Append($"{columnNames[i].Item1}={columnNames[i].Item2}"); if (i < columnNames.Count - 1) { sqlBuilder.Append(", "); } } WhereClauseBuildResult whereClauseBuildResult = null; if (expression != null) { whereClauseBuildResult = this.BuildWhereClause(expression); sqlBuilder.Append($" WHERE {whereClauseBuildResult.WhereClause}"); } return(new Tuple <string, IEnumerable <Tuple <string, string, object> >, WhereClauseBuildResult>(sqlBuilder.ToString(), columnNames, whereClauseBuildResult)); }