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: p> J'utilise un service de fête 3D qui me donne les dernières informations (Toon, Boss, Time). 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. P> 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? Tous les pointeurs / suggestions sont toujours appréciés. P> P>
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. P>
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? P>
4 Réponses :
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();
Cela ne me donnera-t-il pas "ID dupliqué" si j'ai déjà Toon avec id = 1?
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();
Je suis d'accord, la performance n'est pas une préoccupation ici, alors utilisez l'approche LINQ sur le SQL laid SQL
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. p>
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. P>
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: voir Ici pour une méthode d'extension pour cela. P> p>