【问题标题】:Update value if exist or insert in SQL with C# linq如果存在则更新值或使用 C# linq 在 SQL 中插入
【发布时间】: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 表达式(我没有太多经验)。

我想(如果可能的话)删除查询并放置一些我可以更容易控制且最重要的是在发生更改时轻松维护它,例如数据库设计或对现有值进行大规模更改。

编辑: 我真的不明白为什么我有反对票。 我给出了一个已经有效的特定代码,并询问是否有更好的方法。

【问题讨论】:

  • 如果你想用 LINQ 编写你必须使用EF 或任何其他ORM
  • 您的 SQL 脚本仍然可以用MERGE 运算符、more info 来重写
  • @AlexLarionov 是的,但我已经写过我想避免使用简单的 sql 查询
  • @styx 我的程序中已经有 linq 查询,但我不知道是否以及如何使用 linq 重写它
  • @rippergr 只是分解为小查询,即“IF EXISTS..”可以替换为Any()

标签: c# sql linq lambda


【解决方案1】:

通过使用实体框架,您可以使用AddOrUpdate 方法。

您需要在 using 语句中包含 System.Data.Entity.Migrations;

但请注意,它不是原子的,而且它不是线程安全的

【讨论】:

  • 对不起,但我认为这比我使用的更糟糕:)
  • @rippergr 你没有理由感到抱歉 :) 我不知道你说的更糟是什么意思?!根据您的要求:“如果有更简单或更优雅的方式....如果某些事情发生变化,我可以更轻松地控制并且最重要的是轻松维护它”并且因为这个答案建议使用 linqtoentities 以及强类型实体,它绝对提供了一种更简单、更优雅的方式来做你想做的事,它绝对让变更管理更容易!由于您不再需要使用非强类型脏字符串来生成 TSQL。
  • @Karamafrooz 我的意思不是更糟,而是更复杂。
  • @rippergr 我看不出调用一个方法来抽象出你在你的问题或你发布的答案中努力做的事情是多么复杂?
  • @我相信我对这段代码的调试有更多的控制权。也许我错了
【解决方案2】:

我找到了答案。 这是使用 linq 和 lambda 表达式的代码

        List<KodikosProtimisis> newListKodikosProtimisis = new List<KodikosProtimisis>();
                    newListKodikosProtimisis.Add(new KodikosProtimisis { Kodikos = "100", Perigrafi = "Δασμός τρίτων χωρών έναντι όλων (erga omnes)", TaricTiposMetrou = "103" });
                    newListKodikosProtimisis.Add(new KodikosProtimisis { Kodikos = "110", Perigrafi = "Αυτόνομη δασμολογική αναστολή έναντι όλων (erga omnes) (προσωρινή αναστολή των αυτόνομων δασμών για ορισμένα εμπορεύματα του αγροτικού, χημικού, αεροναυπηγικού και του ηλεκτρονικού τομέα)", TaricTiposMetrou = "112" });
                    newListKodikosProtimisis.Add(new KodikosProtimisis { Kodikos = "420", Perigrafi = "Ποσόστωση τελωνειακής ένωσης", TaricTiposMetrou = "112" });
                    newListKodikosProtimisis.Add(new KodikosProtimisis { Kodikos = "422", Perigrafi = "Ποσόστωση τελωνειακής ένωσης", TaricTiposMetrou = "112" });
    .
    .
    .
    more values
                    foreach (var kodikosProtimisis in newListKodikosProtimisis)
                    {

                        using (Ektel db = new Ektel(EktelDataContextManager.ConnectionString))
                        {

                            var qry = db.KodikosProtimisis.Where(x => x.Kodikos == kodikosProtimisis.Kodikos).FirstOrDefault();

                            if (qry != null)
                            {
                                // The value exists .Update
                                qry.Kodikos = kodikosProtimisis.Kodikos;
                                qry.Perigrafi = kodikosProtimisis.Perigrafi;
                                qry.TaricTiposMetrou = kodikosProtimisis.TaricTiposMetrou;
                            }
                            else
                            {
                                //The value doesnt exist.Insert.
                                db.KodikosProtimisis.InsertOnSubmit(new KodikosProtimisis
                                {
                                    Kodikos = kodikosProtimisis.Kodikos,
                                    Perigrafi = kodikosProtimisis.Perigrafi,
                                    TaricTiposMetrou = kodikosProtimisis.TaricTiposMetrou
                                });
                            }

                        db.SubmitChanges();
                    }

                }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-31
    • 2015-08-14
    • 2014-10-23
    • 1970-01-01
    • 2020-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多