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); } }
/// <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); } }
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()); }
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()); }
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()); }
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()); }
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); } }
/// <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); } }