Esempio n. 1
0
        /// <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);
        }
Esempio n. 2
0
        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));
        }