2010-06-02 5 views
5

J'ai besoin d'aide pour recréer ce code LINQ-SQL hérité qui génère environ 100 instructions de mise à jour.LINQ-SQL Mise à jour de plusieurs lignes dans une seule transaction

Je vais continuer à jouer avec la meilleure solution, mais j'apprécierais quelques idées/expériences passées avec ce problème.

Voici mon code:

List<Foo> foos; 
int userId = 123; 

using (DataClassesDataContext db = new FooDatabase()) 
{ 
    foos = (from f in db.FooBars 
      where f.UserId = userId 
      select f).ToList(); 

    foreach (FooBar fooBar in foos) 
    { 
     fooBar.IsFoo = false; 
    } 

    db.SubmitChanges() 
} 

Essentiellement, je veux mettre à jour le champ IsFoo à false pour tous les enregistrements qui ont une valeur UserId particulière.

Ce qui est passe est le .ToList() est tir hors une requête pour obtenir toutes les FooBars pour un utilisateur particulier, puis pour chaque objet Foo, son exécution d'une instruction UPDATE mise à jour la propriété IsFoo.

Est-il possible de recréer le code ci-dessus en une seule instruction UPDATE?

Idéalement, le seul SQL que je veux le feu est ci-dessous:

UPDATE FooBars 
SET IsFoo = FALSE 
WHERE UserId = 123 

EDIT

Ok ressemble tellement qu'il ne peut pas être fait sans utiliser db.ExecuteCommand.

Grr ...!

Ce que je vais probablement faire est de créer une autre méthode d'extension pour l'espace de noms DLINQ. Encore besoin de codage en dur (c'est-à-dire écrire "WHERE" et "UPDATE"), mais au moins il cache la plupart des détails de l'implémentation loin de la syntaxe réelle de la requête LINQ.

+0

Je ne pense pas que vous pouvez faire cela en une seule transaction. – VoodooChild

Répondre

2

Vérifiez DataClassesDataContext.ExecuteCommand ...

+0

J'ai vu quelques exemples de cela - mais cela n'implique-t-il pas de coder en dur le SQL comme une chaîne et de passer cela à la méthode ExecuteCommand? Le but de LINQ-SQL était de faire abstraction des détails sous-jacents de la base de données. – RPM1984

+0

Vous avez raison. La seule raison ici est la performance. Pas besoin d'obtenir toutes les données à votre application, et de revenir juste pour la mise à jour simple. Si vous avez plus de 100 entités, la différence sera très grande ... – Marko

+0

Yep - seul moyen d'y aller semble-t-il. J'ai été attristé de voir que ce problème existe également dans EF. – RPM1984

Questions connexes