2009-08-02 6 views
1

J'ai récemment développé une application C# en utilisant Linq. Je reçois d'une base de données externe une liste de profils que je dois traiter, certains sont nouveaux et d'autres sont déjà dans la base de données, et doivent être mis à jour. Ce que je fais aujourd'hui est de passer en revue la liste des profils et de vérifier chaque profil si tel est le cas. Je le mets à jour sinon je l'insère - cette solution fonctionne très bien. Je suis sûr qu'il existe un moyen d'utiliser l'insertion/mise à jour en vrac quelque chose comme UPDATE ON DUPLICATE, de cette façon je peux gagner du temps car les fichiers sont énormes et l'insertion/mise à jour en masse est connue pour avoir de meilleures performances. Je voudrais éviter l'itération que j'utilise maintenant.Visual studio C# Linq bulk insert/mise à jour

insertall ne fonctionne pas pour les lignes déjà stockées, je besoin de la combinaison des deux mise à jour et insérer

Voici mon code, votre aide est très appréciée.

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

Répondre

2

Une optimisation possible serait de créer une liste de tous les éléments que vous avez de l'application externe, puis lisez tous les articles de la base de données qui correspondent à la fois, au lieu de faire plusieurs allers-retours. Vous pouvez ensuite mettre à jour tous ceux-là, insérer tous ceux qui restent et appeler SubmitChanges à la fin - vous aurez alors 2 allers-retours à la base de données au lieu d'un par profil récupéré en externe.

Je ne sais pas d'une mise à jour en vrac ou insérer des fonctionnalités dans LINQ to SQL

+0

Cela signifie que je vais devoir parcourir la liste des éléments à déterminer qui sont situés dans la base de données et mettre à jour un par un , pensez-vous que c'est mieux? – user149318

+0

Salut à tous L'impact sur les performances d'un grand succès sur la base de données, et de l'itération sur celle-ci, devrait être moindre que de faire de nombreux petits appels à la base de données. Vous devriez donc avoir une optimisation nette. – Joon

+0

Comment faire une telle optimisation? Je suis conscient du fait que le bulk est préférable mais existe-t-il un moyen de le faire en utilisant LINQ? en termes d'insertion et de mise à jour dans une opération en bloc. – user149318