2009-03-13 6 views
0

J'ai besoin d'obtenir 1000 lignes d'une base de données, et en même temps les marquer comme 'en cours'. De cette façon, un autre thread ne peut pas prendre les mêmes 1000 lignes et les traiter également.linq peut-il se mettre à jour et interroger de manière atomique?

Avec LINQ je fais quelque chose comme ceci:

msgs = (de m database.messages où (== MESSAGESTATUSINIT Mariage) select m) .Take (1000) .ToList();

idéalement je voudrais en même temps définir le statut à MESSAGESTATUSPROCESSING. Bien sûr, cela DOIT être atomique.

des idées? Ou est-ce retour à SQL?

merci!

Répondre

2

Vous ne pouvez pas faire cela dans linq2sql. Utilisez une procédure stockée et configurez-la sur le concepteur pour générer le message. De cette façon, vous pouvez manipuler les entités chargées et valider les modifications normalement.

Vérifiez cela pour la façon de le faire (cartographie spécifiquement le type de retour de SProc Méthodes de Classes de modèles de données): http://weblogs.asp.net/scottgu/archive/2007/08/16/linq-to-sql-part-6-retrieving-data-using-stored-procedures.aspx

+0

C'est comme ça que je le ferais aussi. –

+0

génial! Merci! – Toad

0

Vous pouvez entourer le code avec un verrou {}.

Lock Keyword

+0

vrai, mais je veux aussi d'autres processus (même sur d'autres ordinateurs) pour ne pas obtenir ces enregistrements. Aussi, il semble stupide de foreach à travers 1000 enregistrements et de le mettre en traitement, quand cela peut être fait avec 1 instruction atomique sql – Toad

1

Linq lui-même ne va pas offrir cette capacité; Gardez à l'esprit Linq == Requêtes. La mise à jour des données a lieu ailleurs.

Il est peut-être préférable d'écrire une procédure stockée pour renvoyer les résultats; Le sproc peut mettre à jour la table et renvoyer les résultats de manière atomique, et votre application aura alors un seul appel.

+1

linq2sql est non seulement des requêtes, mais vous avez raison, il ne supporte pas ce scénario. Il existe des méthodes personnalisées sur certains blogs pour effectuer des mises à jour par lots, mais elles ne renvoient pas un ensemble de résultats en même temps. – eglasius

Questions connexes