Обновите значение, если оно существует, или вставьте в SQL с C# linq - PullRequest
0 голосов
/ 22 марта 2020

У меня есть этот код, который работает нормально, и я обновляю значение, если существует, или вставляю, если нет

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 (с которыми у меня мало опыта).

Я хочу (если это возможно) удалить запрос и поместить что-то, что я могу контролировать, более легким и наиболее важным, чтобы поддерживать его легко, если что-то меняется, например, дизайн базы данных или что-то массово изменить в существующих значениях.

РЕДАКТИРОВАТЬ: Я действительно не понимаю, почему у меня есть отрицательные голоса. Я даю определенный c код, который уже работает, и спрашиваю, есть ли лучший способ.

Ответы [ 2 ]

0 голосов
/ 23 марта 2020

Я нашел ответ. Вот код, который использует выражения 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();
                    }

                }
0 голосов
/ 22 марта 2020

Используя Entity Framework, вы можете использовать AddOrUpdate метод.

Вам необходимо включить System.Data.Entity.Migrations; в свои операторы использования.

Но обратите внимание, что это не атом c и не потокобезопасен .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...