Linq-SQL Ent ASP.NET MVC 2.0 SQL Server 2008 года
Я создаю играющий сайт, который отслеживает, когда конкретный игрок (toon) победил конкретного монстра (босс). Таблица смотрит что-то как:
int ToonId
int BossId
datetime LastKillTime
Я использую 3-й партийный сервис, который дает мне назад последнюю информацию (toon, босс, время).
Теперь я хочу обновить свою базу данных с той новой информацией.
Метод решения "в лоб" состоит в том, чтобы сделать линию за линией upsert. Но Это выглядит ужасным (мудрый кодом), и, вероятно, замедлитесь также.
Я передумываю, решение состояло бы в том, чтобы вставить новые данные (использующий временную таблицу?) и затем выполненный оператор MERGE.
Это - хорошая идея? Я знаю, что временные таблицы являются "лучше избегаемыми". Я должен составить постоянную "временную" таблицу только для этой операции?
Или я должен просто считать весь текущий набор (100 строк самое большее), действительно объединитесь и отложите его из приложения?
Любые указатели/предложения всегда ценятся.
ORM - неподходящий инструмент для выполнения пакетных операций, и Linq-to-SQL не исключение. В этом случае, я думаю, вы выбрали правильное решение: быстро сохраните все записи во временной таблице, а затем выполните UPSERT с помощью слияния.
Самый быстрый способ сохранить данные во временной таблице - использовать SqlBulkCopy для сохранения всех данных в таблице по вашему выбору.
Если вы используете 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 строк, я бы не стал слишком беспокоиться о производительности.
Похоже на прямую пластину.
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();