2010-12-01 4 views
5

Totalement confus à propos des types de données requis ici.Convertir Linq ObjectQuery IQueryable en IEnumerable

J'ai cette déclaration Linq:

   var feat = AllCustomers 
        .Select(c => c.CustomerServices.SelectMany(cs => cs.CustomerServiceFeatures) 
        .SelectMany(csf => csf.ConfigElements).Where(ce => ce.Name == "ItemType").Select(ce => ce.Value).Distinct()); 

Il renvoie les données requises et VS me dit que le type est défini comme:

System.Data.Objects.ObjectQuery<System.Collections.Generic.IEnumerable<string>> 

Cependant, je veux ajouter ces données dans une liste de chaînes:

List<string> itemTypes = new List<string>(); 
itemTypes.AddRange(feat); 

Mais cela jette une erreur:

Argument 1: cannot convert from 'System.Linq.IQueryable<System.Collections.Generic.IEnumerable<string>>' to 'System.Collections.Generic.IEnumerable<string>' 

Je ne trouve pas la syntaxe requise pour convertir le type correct. Quelqu'un peut-il aider?

Cheers, Matt

Répondre

8

montre d'erreur de compilation, que feat est "collection de collection de chaîne" (littéralement "IQueryable de IEnumerable of string"). Vous avez donc besoin de générer une collecte à plat.

feat.SelectMany(x => x) 
+1

La réponse me regardait droit dans le visage tout ce temps, j'essayais toutes sortes de trucs de SelectMany() en plus de celui-ci. Aussi .. cette réponse a été très difficile à Google pour! –

0

vous pouvez utiliser

List<string> list = feat.ToList<string>() 
+0

Je ne vous ai pas déprimé, mais cela ne fonctionne pas. Vous avez besoin de SelectMany() pour aplatir la collection. – Rap

0

Selon ce que vous devez faire avec la liste que vous pouvez juste faire:

var itemTypes = feat.ToList(); 
1

System.Data.Objects.ObjectQuery<T> est une implémentation de System.Linq.IQueryable<T>. Votre type, cependant, est un IQueryable d'objets IEnumerable. Effectuez un SelectMany, donc vous n'avez plus une collection de collections de chaînes, mais juste une collection de chaînes.

Questions connexes