使用泛型,询问表名和转换对象的方法。
void DoTheThing<TSystem>(string tableName, Func<TSystem, TSystem> transform)
{
using var command = dbContext.Database.GetDbConnection().CreateCommand();
command.CommandText = @$"SELECT ""Id""::varchar, ""InitialObject""::varchar from ""{tableName}""";
using var reader = command.ExecuteReader();
if (reader.HasRows)
{
while (reader.Read())
{
var id = reader.IsDBNull(0) ? Guid.Empty : Guid.Parse(reader.GetString(0));
var initialJson = reader.IsDBNull(1) ? "null" : reader.GetString(1);
var initialObj = JsonConvert.DeserializeObject<TSystem>(initialJson);
string transformedJson = JsonConvert.SerializeObject(transform(initialObj)).Replace("'", "''", StringComparison.Ordinal);
migrationBuilder.Sql($"UPDATE \"{tableName}\" SET \"InitialObject\" = '{transformedJson}'::jsonb WHERE \"Id\" = '{id}'");
}
}
reader.Close();
}
如果
transform
不同的
键入,然后将方法签名更改为
void DoTheThing<TSystem, TTransformed>(string tableName, Func<TSystem, TTransformed> transform)