【发布时间】:2020-07-03 04:45:02
【问题描述】:
我的代码运行良好,如果存在则更新值,如果不存在则插入
List<KodikosProtimisis> newList = new List<KodikosProtimisis>();
newList.Add(new KodikosProtimisis { Kodikos = "100", Perigrafi = "Description", TaricTiposMetrou = "103" });
newList.Add(new KodikosProtimisis { Kodikos = "110", Perigrafi = "Description", TaricTiposMetrou = "112" });
newList.Add(new KodikosProtimisis { Kodikos = "420", Perigrafi = "Description", TaricTiposMetrou = "112" });
.
.
.
(more values)
string connectionString = Configuration.Parameters.Config.ConnectionString;
string query = @"IF EXISTS(SELECT * FROM dbo.KodikosProtimisis WHERE Kodikos = @kodikos and DiasafistisId=@diasafistisId)
UPDATE dbo.KodikosProtimisis
SET Kodikos = @kodikos, DiasafistisId=@diasafistisId,Perigrafi=@perigrafi,TaricTiposMetrou = @taricTiposMetrou
WHERE Kodikos = @kodikos and DiasafistisId=@diasafistisId or DiasafistisId is null
ELSE
INSERT INTO dbo.KodikosProtimisis(Kodikos, Perigrafi,TaricTiposMetrou, DiasafistisId) VALUES(@kodikos, @perigrafi,@taricTiposMetrou, @diasafistisId);";
foreach (var person in newList)
{
using (SqlConnection conn = new SqlConnection(connectionString))
using (SqlCommand cmd = new SqlCommand(query, conn))
{
//δίνουμε τις παραμέτρους στο ερώτημα μας
cmd.Parameters.Add("@kodikos", SqlDbType.NVarChar, 100).Value = person.Kodikos;
cmd.Parameters.Add("@perigrafi", SqlDbType.NVarChar, 200).Value = person.Perigrafi;
cmd.Parameters.Add("@diasafistisId", SqlDbType.Int, 100).Value = DefaultDiasafistis.DiasafistisDefault.Id;
cmd.Parameters.Add("@taricTiposMetrou", SqlDbType.NVarChar, 150).Value = person.TaricTiposMetrou;
conn.Open();
int rowsAffected = cmd.ExecuteNonQuery();
conn.Close();
}
}
使用这段代码,我只需要对 SQL 进行一次查询就可以完成这项工作,但我想知道是否有更简单或更优雅的方法来完成这项工作。
例如,如果我可以使用 linq 和 lambda 表达式(我没有太多经验)。
我想(如果可能的话)删除查询并放置一些我可以更容易控制且最重要的是在发生更改时轻松维护它,例如数据库设计或对现有值进行大规模更改。
编辑: 我真的不明白为什么我有反对票。 我给出了一个已经有效的特定代码,并询问是否有更好的方法。
【问题讨论】:
-
您的 SQL 脚本仍然可以用
MERGE运算符、more info 来重写 -
@AlexLarionov 是的,但我已经写过我想避免使用简单的 sql 查询
-
@styx 我的程序中已经有 linq 查询,但我不知道是否以及如何使用 linq 重写它
-
@rippergr 只是分解为小查询,即“IF EXISTS..”可以替换为
Any()