/// <summary> /// 更新实例。 /// </summary> /// <param name="entityType">模型实例。</param> /// <returns>返回SQL构建实例。</returns> public virtual SqlIndentedStringBuilder Update(IEntityType entityType) { var entry = _updates.GetOrAdd(entityType.ClrType, key => { var names = entityType.GetProperties() .Where(property => property.IsUpdatable()) .Select(property => property.Name) .ToList(); var builder = new SqlIndentedStringBuilder(); builder.Append("UPDATE ").Append(SqlHelper.DelimitIdentifier(entityType.Table)).Append(" SET "); builder.JoinAppend(names.Select(name => $"{SqlHelper.DelimitIdentifier(name)}={SqlHelper.Parameterized(name)}")).AppendLine(); if (entityType.PrimaryKey != null) { var primaryKeys = entityType.PrimaryKey.Properties .Select(p => p.Name) .ToList(); builder.Append("WHERE ") .JoinAppend( primaryKeys.Select( name => $"{SqlHelper.DelimitIdentifier(name)}={SqlHelper.Parameterized(name)}"), " AND ") .Append(SqlHelper.StatementTerminator); names.AddRange(primaryKeys); } return(new CacheEntry(builder.ToString(), names)); }); return(new SqlIndentedStringBuilder(entry.Sql, entry.Parameters)); }
/// <summary> /// 更新实例。 /// </summary> /// <param name="entityType">模型实例。</param> /// <param name="expression">条件表达式。</param> /// <param name="parameters">匿名对象。</param> /// <returns>返回SQL构建实例。</returns> public virtual SqlIndentedStringBuilder Update(IEntityType entityType, Expression expression, object parameters) { var builder = new SqlIndentedStringBuilder(); builder.Append("UPDATE ").Append(SqlHelper.DelimitIdentifier(entityType.Table)).Append(" SET "); builder.CreateObjectParameters(parameters); builder.JoinAppend(builder.Parameters.Keys.Select( name => $"{SqlHelper.DelimitIdentifier(name)}={SqlHelper.Parameterized(name)}")); builder.AppendEx(Visit(expression), " WHERE {0}").Append(SqlHelper.StatementTerminator); return(builder); }
/// <summary> /// 通过唯一主键更新实例。 /// </summary> /// <param name="entityType">模型实例。</param> /// <param name="parameters">匿名对象。</param> /// <returns>返回SQL构建实例。</returns> public virtual SqlIndentedStringBuilder Update(IEntityType entityType, object parameters) { var builder = new SqlIndentedStringBuilder(); builder.Append("UPDATE ").Append(SqlHelper.DelimitIdentifier(entityType.Table)).Append(" SET "); builder.CreateObjectParameters(parameters); builder.JoinAppend(builder.Parameters.Keys.Select( name => $"{SqlHelper.DelimitIdentifier(name)}={SqlHelper.Parameterized(name)}")); AppendWherePrimaryKey(builder, entityType); return(builder); }
/// <summary> /// 更新实例。 /// </summary> /// <param name="entityType">模型实例。</param> /// <returns>返回SQL构建实例。</returns> public virtual SqlIndentedStringBuilder Update(IEntityType entityType) { var entry = _updates.GetOrAdd(entityType.ClrType, key => { var names = entityType.GetProperties() .Where(property => property.IsUpdatable()) .Select(property => property.Name) .ToList(); var builder = new SqlIndentedStringBuilder(); builder.Append("UPDATE ").Append(SqlHelper.DelimitIdentifier(entityType.Table)).Append(" SET "); builder.JoinAppend(names.Select(name => $"{SqlHelper.DelimitIdentifier(name)}={SqlHelper.Parameterized(name)}")).AppendLine(); if (entityType.PrimaryKey != null) { var primaryKeys = entityType.PrimaryKey.Properties .Select(p => p.Name) .ToList(); var keys = new List <string>(); keys.AddRange(primaryKeys); if (entityType.RowVersion != null) { keys.Add(entityType.RowVersion.Name); } if (entityType.ConcurrencyKey != null) { keys.AddRange(entityType.ConcurrencyKey.Properties.Select(x => x.Name)); } names.AddRange(keys); builder.Append("WHERE ") .JoinAppend( keys.Select( name => $"{SqlHelper.DelimitIdentifier(name)}={SqlHelper.Parameterized(name)}"), " AND ") .Append(SqlHelper.fieldsTerminator); if (entityType.RowVersion != null || entityType.ConcurrencyKey != null) { builder.Append(SelectAffectedRows()).Append(" FROM ") .Append(SqlHelper.DelimitIdentifier(entityType.Table)) .Append(" WHERE ") .JoinAppend( keys.Select( name => $"{SqlHelper.DelimitIdentifier(name)}={SqlHelper.Parameterized(name)}"), " AND ") .Append(SqlHelper.fieldsTerminator); } } return(new CacheEntry(builder.ToString(), names)); }); return(new SqlIndentedStringBuilder(entry.Sql, entry.Parameters)); }