Действительно ОБЪЕДИНИТЕ использование Linq с SQL

Linq-SQL Ent ASP.NET MVC 2.0 SQL Server 2008 года

Я создаю играющий сайт, который отслеживает, когда конкретный игрок (toon) победил конкретного монстра (босс). Таблица смотрит что-то как:

int ToonId
int BossId
datetime LastKillTime

Я использую 3-й партийный сервис, который дает мне назад последнюю информацию (toon, босс, время).
Теперь я хочу обновить свою базу данных с той новой информацией.
Метод решения "в лоб" состоит в том, чтобы сделать линию за линией upsert. Но Это выглядит ужасным (мудрый кодом), и, вероятно, замедлитесь также.

Я передумываю, решение состояло бы в том, чтобы вставить новые данные (использующий временную таблицу?) и затем выполненный оператор MERGE.

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

Любые указатели/предложения всегда ценятся.

8
задан THX-1138 6 July 2010 в 16:14
поделиться

3 ответа

ORM - неподходящий инструмент для выполнения пакетных операций, и Linq-to-SQL не исключение. В этом случае, я думаю, вы выбрали правильное решение: быстро сохраните все записи во временной таблице, а затем выполните UPSERT с помощью слияния.

Самый быстрый способ сохранить данные во временной таблице - использовать SqlBulkCopy для сохранения всех данных в таблице по вашему выбору.

7
ответ дан 5 December 2019 в 12:07
поделиться

Если вы используете Linq-to-SQL, апсерты не такие уж уродливые ..

foreach (var line in linesFromService) {
   var kill = db.Kills.FirstOrDefault(t=>t.ToonId==line.ToonId && t.BossId==line.BossId);
   if (kill == null) {
      kill = new Kills() { ToonId = line.ToonId, BossId = line.BossId };
      db.Kills.InsertOnSubmit(kill);
   }
   kill.LastKillTime = line.LastKillTime;
}
db.SubmitChanges();

Не произведение искусства, но лучше, чем в SQL. Кроме того, имея всего 100 строк, я бы не стал слишком беспокоиться о производительности.

7
ответ дан 5 December 2019 в 12:07
поделиться

Похоже на прямую пластину.

private ToonModel _db = new ToonModel();
Toon t = new Toon();
t.ToonId = 1;
t.BossId = 2;
t.LastKillTime = DateTime.Now();
_db.Toons.InsertOnSubmit(t);
_db.SubmitChanges();
0
ответ дан 5 December 2019 в 12:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: