2010-04-28 22 views
15

Estoy usando Linq para consultar mi base de datos y devolver un IList genérico.IEnumerable <> to IList <>

Cualquier cosa que intenté no pude convertir un IQueryable a un IList.

Aquí está mi código.

No puedo escribir más simple que esto y no entiendo por qué no está funcionando.

public IList<IRegion> GetRegionList(string countryCode) 
{ 
    var query = from c in Database.RegionDataSource 
       where (c.CountryCode == countryCode) 
       orderby c.Name 
       select new {c.RegionCode, c.RegionName}; 

    return query.Cast<IRegion>().ToList(); 
} 

Esto devuelve una lista con el número correcto de artículos, pero son todos vacíos Por favor ayuda, estoy bloqued con esto por un par de días

+1

Esta pregunta y las respuestas realmente ilustran el tema de la tipificación de pato, y C#/limitaciones Linq –

Respuesta

16

Su declaración select devuelve un tipo anónimo: new {c.RegionCode, c.RegionName}

Esto no se puede convertir en IRegion - que sería básicamente Pato-tipificación, que C# no soporta.

Su instrucción linq debe devolver un tipo que implemente IRegion - entonces su código debería funcionar.

Sin embargo, no debería ejecutarse: el Cast<IRegion> debería lanzar una excepción de tiempo de ejecución.

Básicamente:

// this isn't anonymous, and should cast 
public class MyRegion : IRegion { 
    public string RegionCode {get;set;} 
    public string RegionName {get;set;} 
} 

public IList<IRegion> GetRegionList(string countryCode) 
{ 
    var query = from c in Database.RegionDataSource 
       where (c.CountryCode == countryCode) 
       orderby c.Name 
       select new MyRegion {RegionCode = c.RegionCode, RegionName = c.RegionName}; 

    return query.Cast<IRegion>().ToList(); 
} 

actualización

Si el tipo de LINQ subyacente implementa IRegion esto puede ser mucho más simple:

public IList<IRegion> GetRegionList(string countryCode) 
{ 
    var query = 
     from region in Database.RegionDataSource 
     where region.CountryCode == countryCode 
     orderby region.Name 
     select region; 

    return query.ToList(); 
} 
+1

No debería necesitar el 'Molde ()' ahora que está proyectando en un tipo concreto. –

+0

@cottsak: Sí, lo hará - 'IList ' es invariante. –

+0

Tengo mi región de clase autogenerada Linq que implementa IRegion. Cuando lo uso, recibí otro mensaje de error No se permite la construcción explícita del tipo de entidad 'xxxx.LinqToSql.xxxx.Region' en la consulta. – nachid

5

Me sorprende que no se trata sólo de no completamente - Está tratando de convertir cada resultado en IRegion, pero está generando instancias de tipo anónimo, lo que ciertamente no implementará IRegion.

¿Tiene tiene un tipo de hormigón que implementa IRegion?

+3

quizá el número correcto de elementos era 0 – Jimmy

2

El reparto a IRegion won' t trabajo. Está seleccionando un tipo anónimo que no implementará IRegion. ¿Hay alguna manera de crear una instancia de algo que implemente IRegion?

1

Tal vez usted necesita algo como esto:

public IList<IRegion> GetRegionList(string countryCode) 
{ 
    var query = from c in Database.RegionDataSource 
       where (c.CountryCode == countryCode) 
       orderby c.Name 
       select new Region() 
        { 
         RegionCode = c.RegionCode, 
         RegionName = c.RegionName 
        }; 

    return query.ToList(); 
} 
+0

Necesito de alguna manera para convertir a IRegion antes de devolver mi consulta El compilador se queja de que no puede convertir IList en IList nachid

+0

Skeet es correcto. Es necesario el 'moldeada ()' –

0

Tal vez usted necesita algo como esto:

public IList<IRegion> GetRegionList(string countryCode) 
{ 
    var query = from c in Database.RegionDataSource 
       where (c.CountryCode == countryCode) 
       orderby c.Name 
       select new Region() 
        { 
         RegionCode = c.RegionCode, 
         RegionName = c.RegionName 
        }; 

    return query.ToList(); 
} 
+0

que terminé haciendo este pública IList GetRegionList (countryCode cadena) {var query = de C en donde Database.RegionDataSource (c.CountryCode == countryCode) OrdenarPor c.Name seleccionar do; consulta de retorno.Cast () .ToList(); } Volveré aquí pronto y te lo agradeceré Gracias por tu valiosa ayuda – nachid

Cuestiones relacionadas