2008-11-25 7 views
8

Pour une raison quelconque, mon code ne fonctionnera pas.Erreur LINQtoSQL: les opérateurs de séquence ne sont pas pris en charge pour le type 'System.String'

from tan in TANS 
    where tan.ID.ToString().Count() != 1 
    select tan 

Je veux sélectionner tous les ID qui sont des doublons dans une table, donc je suis en utilisant le compte! = 1 et je reçois cette erreur.

NotSupportedException: opérateurs de séquence non pris en charge pour le type 'System.String'

Aide s'il vous plaît?

Répondre

13

tan.ID.ToString() est une chaîne, pas une collection, donc vous ne pouvez pas appliquer Count().

Je crois que vous voulez quelque chose comme: (Cette syntaxe est erronée, mais proche)

from tan in TANS 
group tan by tan.ID into dups 
where dups.Count() > 1 
select dups.Key; 

Mise à jour (après 5 ans moins 5 jours): (Il est un peu bizarre de Google un problème et trouver une réponse Vous avez écrit ..) Au cœur de ce problème est l'instruction LINQ essaye de construire une instruction SQL, et la base de données ne sait pas comment appliquer Count() à une chaîne. Toutefois, si vous utilisez LINQ sur une collection en mémoire, la chaîne sera traitée comme IEnumerable et Count() fonctionnera correctement.

5

La réponse de James est proche de ce que je pense que vous voulez, si vous voulez juste la valeur de l'ID elle-même aller avec le sien. Si vous voulez que l'objet soit assigné à l'ID, essayez ceci.

var dupes = (from tan in TANS 
      group tan by tan.ID.ToString() into duplicates 
      where duplicates.Count() > 1 
      select duplicates.Select(d => d)).SelectMany(d => d); 

Pas le moyen le plus propre de le faire dans LINQ Je suis sûr. Si je trouve une façon plus simple de le faire, je vais l'éditer ici. SelectMany est important car il aplatit la liste des objets de l'IGrouping.

Questions connexes