2010-06-12 3 views
0

Je renvoie deux listes de la base de données en utilisant la requête compilée LINQ to SQL. Lors de la mise en boucle de la première liste, je supprime les doublons de la deuxième liste, car je ne veux plus traiter les objets déjà existants..Remove (objet) sur une liste <T> retourné de requête compilée LINQ to SQL ne supprime pas l'objet droit

par ex.

//oldCustomers is a List<Customer> returned by my Compiled Linq to SQL Statmenet that I have added a .ToList() at the end to 

//Same goes for newCustomers 

for (Customer oC in oldCustomers) 
{ 
    //Do some processing 
    newCustomers.Remove(newCusomters.Find(nC=> nC.CustomerID == oC.CusomterID)); 

} 

for (Cusomter nC in newCustomers) 
{ 
    //Do some processing 
} 


DataContext.SubmitChanges() 

je me attends à ce que pour sauver les modifications qui ont été apportées aux clients dans mon traitement et non supprimer ou Supprimer un de mes clients de la base de données.

Correct?

Je l'ai essayé et il fonctionne très bien - mais je suis en train de savoir s'il y a un cas rare, il pourrait effectivement être supprimée

Répondre

3

droit. Lorsque vous appelez la méthode d'extension .ToList() sur tout IEnumerable, une nouvelle liste en mémoire de ces éléments est créée, sans aucune liaison à l'emplacement précédent des éléments.

Vous pouvez ajouter ou supprimer des éléments dans une telle liste sans craindre certains effets secondaires.

Mais je dois ajouter que votre code est terrible en termes de performances. for (Cusomter nC in newCusomters.Except(oldCustomers)) est beaucoup plus rapide et plus facile à écrire.

0

Droite. List<T>.Remove() supprime l'élément de la collection List.

Vous devez appeler DeleteOnSubmit() sur la classe LINQ Table pour supprimer l'élément de votre base de données. En outre, votre algorithme de liste en double est plutôt inefficace. Une façon de le réécrire est d'utiliser la classe HashSet dans .NET 3.5 qui vous donnera O (1) des recherches au lieu de l'O (n) que fait Find.

1

Je ne sais pas à quoi sert de réinventer la roue quand il s'agit de syndicats. Si vous utilisez .NET 3.5 ou version ultérieure, utilisez simplement la méthode d'union LINQ.

Assurez-vous d'avoir:

'using System.Linq' 

Ensuite, utilisez:

var customers = oldCustomers.Union(newCustomers).To.List(); 

Union combine les deux listes et supprime les doublons.

Note: Le .ToList() est pas nécessaire si vous utilisez var, il est nécessaire si vous ne le faites pas.