internal static bool PrepareUpdateAnonSql <T>(this IDbCommand dbCmd, IOrmLiteDialectProvider dialectProvider, object updateOnly, string whereSql) { var sql = StringBuilderCache.Allocate(); var modelDef = typeof(T).GetModelDefinition(); var fields = modelDef.FieldDefinitionsArray; var fieldDefs = new List <FieldDefinition>(); if (updateOnly is IDictionary d) { foreach (DictionaryEntry entry in d) { var fieldDef = modelDef.GetFieldDefinition((string)entry.Key); if (fieldDef == null || fieldDef.ShouldSkipUpdate()) { continue; } fieldDefs.Add(fieldDef); } } else { foreach (var setField in updateOnly.GetType().GetPublicProperties()) { var fieldDef = fields.FirstOrDefault(x => string.Equals(x.Name, setField.Name, StringComparison.OrdinalIgnoreCase)); if (fieldDef == null || fieldDef.ShouldSkipUpdate()) { continue; } fieldDefs.Add(fieldDef); } } var hadRowVersion = false; foreach (var fieldDef in fieldDefs) { var value = fieldDef.GetValue(updateOnly); if (fieldDef.IsPrimaryKey || fieldDef.AutoIncrement || fieldDef.IsRowVersion) { if (fieldDef.IsRowVersion) { hadRowVersion = true; } whereSql += string.IsNullOrEmpty(whereSql) ? "WHERE " : " AND "; whereSql += $"{dialectProvider.GetQuotedColumnName(fieldDef.FieldName)} = {dialectProvider.AddQueryParam(dbCmd, value, fieldDef).ParameterName}"; continue; } if (sql.Length > 0) { sql.Append(", "); } sql .Append(dialectProvider.GetQuotedColumnName(fieldDef.FieldName)) .Append("=") .Append(dialectProvider.GetUpdateParam(dbCmd, value, fieldDef)); } dbCmd.CommandText = $"UPDATE {dialectProvider.GetQuotedTableName(modelDef)} " + $"SET {StringBuilderCache.ReturnAndFree(sql)} {whereSql}"; return(hadRowVersion); }
internal static void PrepareUpdateAnonSql <T>(this IDbCommand dbCmd, IOrmLiteDialectProvider dialectProvider, object updateOnly, string whereSql) { var sql = StringBuilderCache.Allocate(); var modelDef = typeof(T).GetModelDefinition(); var fields = modelDef.FieldDefinitionsArray; foreach (var setField in updateOnly.GetType().GetPublicProperties()) { var fieldDef = fields.FirstOrDefault(x => string.Equals(x.Name, setField.Name, StringComparison.OrdinalIgnoreCase)); if (fieldDef == null || fieldDef.ShouldSkipUpdate()) { continue; } var value = setField.CreateGetter()(updateOnly); if (string.IsNullOrEmpty(whereSql) && (fieldDef.IsPrimaryKey || fieldDef.AutoIncrement)) { whereSql = $"WHERE {dialectProvider.GetQuotedColumnName(fieldDef.FieldName)} = {dialectProvider.AddQueryParam(dbCmd, value, fieldDef).ParameterName}"; continue; } if (sql.Length > 0) { sql.Append(", "); } sql .Append(dialectProvider.GetQuotedColumnName(fieldDef.FieldName)) .Append("=") .Append(dialectProvider.AddUpdateParam(dbCmd, value, fieldDef).ParameterName); } dbCmd.CommandText = $"UPDATE {dialectProvider.GetQuotedTableName(modelDef)} " + $"SET {StringBuilderCache.ReturnAndFree(sql)} {whereSql}"; }