コード例 #1
0
        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;
                }

                if (sql.Length > 0)
                {
                    sql.Append(", ");
                }

                var value = setField.GetPropertyGetterFn()(updateOnly);
                sql
                .Append(dialectProvider.GetQuotedColumnName(fieldDef.FieldName))
                .Append("=")
                .Append(dialectProvider.AddParam(dbCmd, value, fieldDef.ColumnType).ParameterName);
            }

            dbCmd.CommandText = $"UPDATE {dialectProvider.GetQuotedTableName(modelDef)} " +
                                $"SET {StringBuilderCache.ReturnAndFree(sql)} {whereSql}";
        }