2010-12-01 17 views
5

totalmente confundido acerca de los tipos de datos necesarios aquí.Convertir LINQ ObjectQuery IQueryable a IEnumerable

tengo esta declaración de 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()); 

Devuelve los datos requeridos, y VS me dice que el tipo se establece como:

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

Sin embargo, quiero añadir estos datos en una lista de cadenas:

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

Pero esto genera un error:

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

No puedo encontrar la sintaxis necesaria para echar a tipo correcto. ¿Alguien puede ayudar?

Cheers, Matt

Respuesta

8

muestra un error en tiempo de compilación, que feat es "colección de colección de cadena" (literalmente "IQueryable de IEnumerable of string"). Entonces necesitas generar una colección plana.

feat.SelectMany(x => x) 
+1

La respuesta me estaba mirando directamente a la cara todo este tiempo, estaba probando todo tipo de trucos de SelectMany() además de este. Además ... ¡esta respuesta fue muy difícil de buscar para Google! –

0

puede utilizar

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

que no te lo Downvote pero esto no funciona. Necesita SelectMany() para aplanar la colección. – Rap

0

Dependiendo de lo que tiene que ver con la lista sólo se puede hacer:

var itemTypes = feat.ToList(); 
1

System.Data.Objects.ObjectQuery<T> es una implementación de System.Linq.IQueryable<T>. Sin embargo, su tipo es un IQueryable de objetos IEnumerable. Realice un SelectMany, por lo que ya no tendrá una colección de colecciones de cadenas, sino solo una colección de cadenas.

Cuestiones relacionadas