8
votes

Fusionner à l'aide de LINQ vers SQL

SQL Server 2008 ENT ASP.NET MVC 2.0 LINQ-TO-SQL

Je construis un site de jeu, qui suit lorsqu'un joueur particulier (Toon) avait abattu un monstre particulier (patron). Le tableau ressemble à quelque chose comme: xxx

J'utilise un service de fête 3D qui me donne les dernières informations (Toon, Boss, Time).
Maintenant, je veux mettre à jour ma base de données avec cette nouvelle information.
L'approche de la force brute est de faire de la ligne upsert. Mais ça a l'air laids (code) et probablement lent aussi.

Je pense qu'une meilleure solution serait d'insérer de nouvelles données (à l'aide de la table tempée?), Puis exécutez la déclaration de fusion.

Est-ce une bonne idée? Je sais que les tables Temps sont "meilleures à éviter". Devrais-je créer une table "temp" permanente juste pour cette opération?
Ou devrais-je simplement lire l'ensemble de l'ensemble actuel (100 rangées au plus), faites-le fusionner et le remettre à partir de l'application?

Tous les pointeurs / suggestions sont toujours appréciés.


0 commentaires

4 Réponses :


0
votes

ressemble à un insert simple.

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();


1 commentaires

Cela ne me donnera-t-il pas "ID dupliqué" si j'ai déjà Toon avec id = 1?



7
votes

Si vous utilisez LINQ-TO-SQL, UPSERTS ne sont-ils pas si laids ..

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();


1 commentaires

Je suis d'accord, la performance n'est pas une préoccupation ici, alors utilisez l'approche LINQ sur le SQL laid SQL



7
votes

Un orm est le mauvais outil pour effectuer des opérations de lot et LINQ-TO-SQL ne fait pas exception. Dans ce cas, je pense que vous avez choisi la bonne solution: stockez rapidement toutes les entrées dans une table temporaire, puis faites l'upert en utilisant la fusion.

Le moyen le plus rapide de stocker les données sur la table temporaire consiste à utiliser SQLBULKCOPY pour stocker toutes les données à une table de votre choix.


0 commentaires

0
votes

Pour mettre à jour sans interroger les enregistrements d'abord, vous pouvez faire ce qui suit. Il va toujours frapper la DB une fois pour vérifier si l'enregistrement existe, mais ne tirera pas l'enregistrement: xxx

voir Ici pour une méthode d'extension pour cela.


0 commentaires