是否有办法使这两个块的共同功能



我有两个块;在每个块中,我使用命令和阅读器从表中检索数据并转换数据,然后更新相同的数据。我希望通过将表名、类型和转换函数从这两个块

传递到该函数来提取公共函数下面是相同的代码

//Block #1

using var queryProjectSteamSystemsCommand = dbContext.Database.GetDbConnection().CreateCommand();
queryProjectSteamSystemsCommand.CommandText = @"SELECT ""Id""::varchar, ""InitialObject""::varchar from ""DesignHubProjectSteamSystems""";
using var steamSystemProjectsReader = queryProjectSteamSystemsCommand.ExecuteReader();
if (steamSystemProjectsReader.HasRows)
{
while (steamSystemProjectsReader.Read())
{
var id = steamSystemProjectsReader.IsDBNull(0) ? Guid.Empty : Guid.Parse(steamSystemProjectsReader.GetString(0));
var steamSystemJson = steamSystemProjectsReader.IsDBNull(1) ? "null" : steamSystemProjectsReader.GetString(1);
var projSteamSystemInitialObj = JsonConvert.DeserializeObject<OldSteamSystem>(steamSystemJson);
string json = JsonConvert.SerializeObject(TransformProjectSteamSystem(projSteamSystemInitialObj)).Replace("'", "''", StringComparison.Ordinal);
migrationBuilder.Sql($"UPDATE "DesignHubProjectSteamSystems"  SET "InitialObject" = '{json}'::jsonb WHERE "Id" = '{id}'");
}
}
steamSystemProjectsReader.Close();

//Block #2

using var queryProjectFuelSystemsCommand = dbContext.Database.GetDbConnection().CreateCommand();
queryProjectFuelSystemsCommand.CommandText = @"SELECT ""Id""::varchar, ""InitialObject""::varchar from ""DesignHubProjectFuelSystems""";
using var fuelSystemProjectsReader = queryProjectFuelSystemsCommand.ExecuteReader();
if (fuelSystemProjectsReader.HasRows)
{
while (fuelSystemProjectsReader.Read())
{
var id = fuelSystemProjectsReader.IsDBNull(0) ? Guid.Empty : Guid.Parse(fuelSystemProjectsReader.GetString(0));
var fuelSystemJson = fuelSystemProjectsReader.IsDBNull(1) ? "null" : fuelSystemProjectsReader.GetString(1);
var projFuelSystemInitialObj = JsonConvert.DeserializeObject<OldFuelSystem>(fuelSystemJson);
string json = JsonConvert.SerializeObject(TransformProjectFuelSystem(projFuelSystemInitialObj)).Replace("'", "''", StringComparison.Ordinal);
migrationBuilder.Sql($"UPDATE "DesignHubProjectFuelSystems"  SET "InitialObject" = '{json}'::jsonb WHERE "Id" = '{id}'");
}
}
fuelSystemProjectsReader.Close();

我不能合并OldSteamSystemOldFuelSystem这两个不同的类。

那么,谁能告诉我如何用它来做一个通用函数呢?

提前感谢!!

使用泛型,并请求表名和转换对象的方法。

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}""";
// I know I complain about SQL injection, you get to fix this one...
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);

// this uses the "transform" parameter, IE a method your caller provides
string transformedJson = JsonConvert.SerializeObject(transform(initialObj)).Replace("'", "''", StringComparison.Ordinal);
migrationBuilder.Sql($"UPDATE "{tableName}"  SET "InitialObject" = '{transformedJson}'::jsonb WHERE "Id" = '{id}'");
// again, SQL injection
}
}
reader.Close();
}

如果transform方法采用一种类型并返回不同的类型,则将方法签名更改为

void DoTheThing<TSystem, TTransformed>(string tableName, Func<TSystem, TTransformed> transform)

最新更新