2009-07-10 4 views
1

J'ai cette colonne,Comment supprimer plusieurs lignes en fonction d'une collection d'éléments de zone clés non-clés à l'aide de LINQ-TO-SQL?

id int primary key, 
code int not null 

Je veux supprimer tous les éléments où le code est égal à l'un des éléments dans un,

IEnumerable<int> someEnumerable 

Une façon possible utilise l'itération. Mais je veux le faire sans itération explicite (pour, foreach). Une autre façon est de le faire:

var result = db.table.Where(a => someEnumerable.Contains(a.code)); 
db.table.DeleteAllOnSubmit(result); 
db.SubmitChanges(); 

Mais pour moi, il provoque:

Une exception non gérée du type 'System.StackOverflowException' a eu lieu dans System.Data.Linq.dll

+0

2 questions: Quelle ligne de code provoque l'exception StackOverflowException? Est-ce que someEnumerable est une séquence en mémoire ou quelque chose provenant de la base de données? –

Répondre

1

Comme indiqué here a été causé par un bug Linq, corrigé sur .NET 4.0

Contient détecte désormais l'auto-référencement IQueryable et ne provoque un débordement de pile

De quelque part dans SO:

En .NET 3.5 pour résoudre le problème: Lorsque vous utilisez 'Auto Generated Value' = True, vous devez définir 'Delay Loaded' sur False - sinon vous obtenez l'erreur de récursion.

0

Il me semble que le code que vous avez devrait fonctionner. Vous pouvez essayer de préciser si l'exception provient de la sélection des entités ou de la suppression réelle. Essayez d'ajouter un objet ToList() à la requête, ce qui l'obligera à exécuter la logique de sélection, puis vérifiez si l'exception est levée lors de la sélection ou de la suppression.

Questions connexes