Exemple #1
0
        private string ResolveUpdate()
        {
            var table   = GetTableMetaInfo().TableName;
            var builder = new StringBuilder();

            if (_setExpressions.Count > 0)
            {
                var where = ResolveWhere();
                foreach (var item in _setExpressions)
                {
                    var column     = new BooleanExpressionResovle(item.Column).Resovle();
                    var expression = new BooleanExpressionResovle(item.Expression, _parameters).Resovle();
                    builder.Append($"{column} = {expression},");
                }
                var sql = $"UPDATE {table} SET {builder.ToString().Trim(',')}{where}";
                return(sql);
            }
            else
            {
                var filters = new GroupExpressionResovle(_filterExpression).Resovle().Split(',');
                var where = ResolveWhere();
                var columns    = GetColumnMetaInfos();
                var updcolumns = columns
                                 .Where(a => !filters.Contains(a.ColumnName))
                                 .Where(a => !a.IsComplexType)
                                 .Where(a => !a.IsIdentity && !a.IsPrimaryKey && !a.IsNotMapped)
                                 .Where(a => !a.IsConcurrencyCheck)
                                 .Select(s => $"{s.ColumnName} = @{s.CsharpName}");
                if (string.IsNullOrEmpty(where))
                {
                    var primaryKey = columns.Where(a => a.IsPrimaryKey).FirstOrDefault()
                                     ?? columns.First();
                    where = $" WHERE {primaryKey.ColumnName} = @{primaryKey.CsharpName}";
                    if (columns.Exists(a => a.IsConcurrencyCheck))
                    {
                        var checkColumn = columns.Where(a => a.IsConcurrencyCheck).FirstOrDefault();
                        where += $" AND {checkColumn.ColumnName} = @{checkColumn.CsharpName}";
                    }
                }
                var sql = $"UPDATE {table} SET {string.Join(",", updcolumns)}";
                if (columns.Exists(a => a.IsConcurrencyCheck))
                {
                    var checkColumn = columns.Where(a => a.IsConcurrencyCheck).FirstOrDefault();
                    sql += $",{checkColumn.ColumnName} = @New{checkColumn.CsharpName}";
                    if (checkColumn.CsharpType.IsValueType)
                    {
                        var version = Convert.ToInt32((DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0)).TotalSeconds);
                        _parameters.Add($"New{checkColumn.CsharpName}", version);
                    }
                    else
                    {
                        var version = Guid.NewGuid().ToString("N");
                        _parameters.Add($"New{checkColumn.CsharpName}", version);
                    }
                }
                sql += where;
                return(sql);
            }
        }
Exemple #2
0
        /// <summary>
        /// 构建更新命令
        /// </summary>
        /// <returns></returns>
        private string BuildUpdateCommand()
        {
            var table       = GetViewName();
            var builder     = new StringBuilder();
            var expressions = _expressions.GetSetExpressions();

            if (expressions.Any())
            {
                var where = BuildWhereExpression();
                foreach (var item in expressions)
                {
                    var column     = new GroupExpressionResovle(_isSingleTable, item.Column).Resovle();
                    var expression = new BooleanExpressionResovle(_isSingleTable, item.Expression, _parameters).Resovle();
                    builder.Append($"{column} = {expression},");
                }
                var sql = $"UPDATE {table} SET {builder.ToString().Trim(',')}{where}";
                return(sql);
            }
            else
            {
                var filters = BuildIgnoreExpression();
                var where = BuildWhereExpression();
                var columns = _columns
                              .Where(a => !filters.Contains(a.ColumnName))
                              .Where(a => !a.IsComplexType)
                              .Where(a => !a.IsPrimaryKey)
                              .Where(a => !a.IsNotMapped)
                              .Where(a => !a.IsIdentity)
                              .Where(a => !a.IsConcurrencyCheck)
                              .ToList();
                var updatecolumns = IgnoreAllNullColumns(columns);
                if (string.IsNullOrEmpty(where))
                {
                    var primaryKey = _columns.Where(a => a.IsPrimaryKey).FirstOrDefault();
                    if (primaryKey == null)
                    {
                        throw new MissingPrimaryKeyException("primary key is required");
                    }
                    where = $" WHERE {primaryKey.ColumnName} = {_parameterPrefix}{primaryKey.CsharpName}";
                }
                var setsql = updatecolumns.Select(s => $"{s.ColumnName} = {_parameterPrefix}{s.CsharpName}");
                var sql    = $"UPDATE {table} SET {string.Join(",", setsql)}";
                //并发检查
                if (_columns.Any(a => a.IsConcurrencyCheck))
                {
                    var checkColumn = _columns.Where(a => a.IsConcurrencyCheck).FirstOrDefault();
                    if (!_parameters.ContainsKey(checkColumn.CsharpName) || _parameters[checkColumn.CsharpName] == null)
                    {
                        throw new ArgumentNullException(checkColumn.CsharpName);
                    }
                    sql   += $",{checkColumn.ColumnName} = {_parameterPrefix}New{checkColumn.CsharpName}";
                    where += $" AND {checkColumn.ColumnName} = {_parameterPrefix}{checkColumn.CsharpName}";
                    _parameters.Add($"New{checkColumn.CsharpName}", GetConcurrencyColumnValue(checkColumn.CsharpType));
                }
                sql = $"{sql}{where}";
                return(sql);
            }
        }
Exemple #3
0
        private string ResolveHaving()
        {
            var buffer = new StringBuilder();

            foreach (var item in _havingExpressions)
            {
                var result = new BooleanExpressionResovle(item, _parameters).Resovle();
                if (item == _havingExpressions.First())
                {
                    buffer.Append($" HAVING {result}");
                }
                else
                {
                    buffer.Append($" AND {result}");
                }
            }
            return(buffer.ToString());
        }
Exemple #4
0
        private string ResolveWhere()
        {
            var builder = new StringBuilder();

            foreach (var expression in _whereExpressions)
            {
                var result = new BooleanExpressionResovle(expression, _parameters).Resovle();
                if (expression == _whereExpressions.First())
                {
                    builder.Append($" WHERE {result}");
                }
                else
                {
                    builder.Append($" AND {result}");
                }
            }
            return(builder.ToString());
        }
Exemple #5
0
        protected string BuildHavingExpression()
        {
            var buffer      = new StringBuilder();
            var expressions = _expressions.GetHavingExpressions();
            var first       = true;

            foreach (var item in expressions)
            {
                var result = new BooleanExpressionResovle(_isSingleTable, item.Expression, _parameters).Resovle();
                if (first)
                {
                    first = false;
                    buffer.Append($" HAVING {result}");
                }
                else
                {
                    buffer.Append($" AND {result}");
                }
            }
            return(buffer.ToString());
        }
Exemple #6
0
        protected string BuildWhereExpression()
        {
            var builder     = new StringBuilder();
            var expressions = _expressions.GetWhereExpressions();
            var first       = true;

            foreach (var expression in expressions)
            {
                var result = new BooleanExpressionResovle(_isSingleTable, expression.Expression, _parameters).Resovle();
                if (first)
                {
                    first = false;
                    builder.Append($" WHERE {result}");
                }
                else
                {
                    builder.Append($" AND {result}");
                }
            }
            return(builder.ToString());
        }
Exemple #7
0
        private string ResolveUpdate()
        {
            var table   = DbMetaCache.GetTable(typeof(T)).TableName;
            var builder = new StringBuilder();

            if (_setExpressions.Count > 0)
            {
                var where = ResolveWhere();
                foreach (var item in _setExpressions)
                {
                    var column     = new BooleanExpressionResovle(item.Column).Resovle();
                    var expression = new BooleanExpressionResovle(item.Expression, _parameters).Resovle();
                    builder.Append($"{column} = {expression},");
                }
                var sql = $"UPDATE {table} SET {builder.ToString().Trim(',')}{where}";
                return(sql);
            }
            else
            {
                var filters = new GroupExpressionResovle(_filterExpression).Resovle().Split(',');
                var where = ResolveWhere();
                var columns    = DbMetaCache.GetColumns(typeof(T));
                var updcolumns = columns
                                 .Where(a => !filters.Contains(a.ColumnName))
                                 .Where(a => !a.IsIdentity && !a.IsPrimaryKey && !a.IsNotMapped)
                                 .Select(s => $"{s.ColumnName} = @{s.CsharpName}");
                if (string.IsNullOrEmpty(where))
                {
                    var primaryKey = columns.Where(a => a.IsPrimaryKey).FirstOrDefault()
                                     ?? columns.First();
                    where = $" WHERE {primaryKey.ColumnName} = @{primaryKey.CsharpName}";
                }
                var sql = $"UPDATE {table} SET {string.Join(",", updcolumns)}{where}";
                return(sql);
            }
        }
Exemple #8
0
        /// <summary>
        /// 构建更新命令
        /// </summary>
        /// <returns></returns>
        private string BuildUpdateCommand(Type entityType = null)
        {
            var table       = GetViewName();
            var builder     = new StringBuilder();
            var expressions = _expressions.GetSetExpressions();

            if (expressions.Any())
            {
                var where = BuildWhereExpression();
                foreach (var item in expressions)
                {
                    var column     = new GroupExpressionResovle(_isSingleTable, item.Column).Resovle();
                    var expression = new BooleanExpressionResovle(_isSingleTable, item.Expression, _parameters).Resovle();
                    builder.Append($"{column} = {expression},");
                }
                var sql = $"UPDATE {table} SET {builder.ToString().Trim(',')}{where}";
                return(sql);
            }
            else
            {
                var filters = new IgnoreExpressionResovle(_filterExpression).Resovles();
                var where = BuildWhereExpression();
                var columns       = _columns;
                var updatecolumns = columns
                                    .Where(a => !filters.Contains(a.ColumnName))
                                    .Where(a => !a.IsComplexType)
                                    .Where(a => !a.IsIdentity && !a.IsPrimaryKey && !a.IsNotMapped)
                                    .Where(a => !a.IsConcurrencyCheck)
                                    .ToList();
                if (typeof(T) != entityType)
                {
                    var temps = new List <DbColumnMetaInfo>();
                    foreach (var item in updatecolumns)
                    {
                        if (_parameters.ContainsKey(item.CsharpName))
                        {
                            temps.Add(item);
                        }
                    }
                    updatecolumns = temps;
                }
                else if (_ignoreAllNullColumns)
                {
                    foreach (var item in _parameters)
                    {
                        if (item.Value == null)
                        {
                            var c = updatecolumns.Where(a => a.CsharpName == item.Key).FirstOrDefault();
                            if (c != null)
                            {
                                updatecolumns.Remove(c);
                            }
                            _parameters.Remove(item.Key);
                        }
                    }
                }
                if (string.IsNullOrEmpty(where))
                {
                    var primaryKey = columns.Where(a => a.IsPrimaryKey).FirstOrDefault();
                    if (primaryKey == null)
                    {
                        throw new Exception("primary key is required");
                    }
                    where = $" WHERE {primaryKey.ColumnName} = {_parameterPrefix}{primaryKey.CsharpName}";
                }
                var setsql = updatecolumns.Select(s => $"{s.ColumnName} = {_parameterPrefix}{s.CsharpName}");
                var sql    = $"UPDATE {table} SET {string.Join(",", setsql)}";
                //并发检查
                if (columns.Any(a => a.IsConcurrencyCheck))
                {
                    var checkColumn = columns.Where(a => a.IsConcurrencyCheck).FirstOrDefault();
                    sql   += $",{checkColumn.ColumnName} = {_parameterPrefix}New{checkColumn.CsharpName}";
                    where += $" AND {checkColumn.ColumnName} = {_parameterPrefix}{checkColumn.CsharpName}";
                    _parameters.Add($"New{checkColumn.CsharpName}", GetConcurrencyColumnValue(checkColumn.CsharpType));
                }
                sql = $"{sql}{where}";
                return(sql);
            }
        }