Visual studio C # Linq массовая вставка / обновление - PullRequest
1 голос
/ 02 августа 2009

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

Я уверен, что есть способ использовать массовую вставку / обновление, например UPDATE ON DUPLICATE, таким образом я могу сэкономить время, так как файлы, которые я получаю, огромны, а известно, что массовая вставка / обновление имеет лучшую производительность. Я хотел бы избежать итерации, которую я сейчас использую.

insertall не работает для уже сохраненных строк, мне нужно сочетание как update, так и insert

Вот мой код, Ваша помощь высоко ценится.

foreach (Profile tmpProfile in profiles)
            {
                try
                {                      
                    var matchedProfile = (from c in db.ProfileEntities
                                          where c.ProfileId == tmpProfile.Id
                                          select c).SingleOrDefault();

                    if (matchedProfile == null)
                    {
                        //Insert
                        db.ProfileEntities.InsertOnSubmit(EntityMapper.ToEntity(tmpProfile));

                    }
                    else
                    {
                        //Update
                        EntityMapper.ToEntity(ref matchedProfile, tmpProfile);                           

                    }                                               
                }
                catch (System.Data.SqlServerCe.SqlCeException sqlExec)
                {                       

                }
                catch (Exception e)
                {

                }
            }

            db.SubmitChanges();

1 Ответ

2 голосов
/ 02 августа 2009

Одной из возможных оптимизаций было бы создание списка всех элементов, которые у вас есть из внешнего приложения, и затем чтение всех элементов из базы данных, которые совпадают одновременно, вместо того, чтобы выполнять несколько циклов.

Затем вы можете обновить все из них, вставить все те, которые остались, и в конце вызвать SubmitChanges - тогда у вас будет 2 обхода в базу данных вместо одного для каждого профиля, полученного извне.

Я не знаю ни одного массового обновления или вставки функций в Linq to SQL

...