Pregunta

Tengo un C # -4 MVC3 RC-prueba de la aplicación que está utilizando Entity Framework 4.

Tengo este método:

public static List<Content> FetchMenu(int websiteID) {
    return (from w in ContextHelper.Current.Websites
            where w.WebsiteID == websiteID
            select w.Contents).ToList();
}

Los objetos en juego aquí (contenido y sitio web) son de tipo EntityObject.

La función anterior da error de compilación:

Cannot implicitly convert type 'System.Linq.IQueryable<System.Collections.Generic.List<Manager.Models.Content>>' to 'System.Collections.Generic.List<Manager.Models.Content>'. An explicit conversion exists (are you missing a cast?)

w.Contents es una colección tipo EntityCollection<Content>.

¿Cómo aplazar el tipo Linq.IQueryable para devolver una lista genérica de tipo de contenido?

¿Fue útil?

Solución

Es necesario paréntesis de uso, por lo que se aplica ToList() a toda la consulta (un objeto de tipo IQueryable):

public static List<Content> FetchMenu(int websiteID) {
    return (from w in ContextHelper.Current.Websites
            where w.WebsiteID == websiteID
            select w.Contents).ToList();
}

De lo contrario, están llamando ToList() en w.Contents única y se aplica el select después. Puede ser que sea más claro si muestro la sintaxis método de encadenamiento.

Su versión:

ContextHelper.
           Current.
           Websites.
           Where(w => w.WebsiteID == websiteID).
           Select(w => w.Contents.ToList());

versión correcta:

ContextHelper.
           Current.
           Websites.
           Where(w => w.WebsiteID == websiteID).
           Select(w => w.Contents).
           ToList();

Editar

Desde w.Contents es una colección, es necesario aplanar a cabo mediante el uso de SelectMany:

public static List<Content> FetchMenu(int websiteID) {
    return ContextHelper.
           Current.
           Websites.
           Where(w => w.WebsiteID == websiteID).
           SelectMany(w => w.Contents).
           ToList();
}

Otros consejos

    var query = (from w in ContextHelper.Current.Websites
                 where w.WebsiteID == websiteID
                 select w.Contents).First();

    return query.ToList();

El .First () parece hacer el truco ... gracias.

respuesta

de Yakimych usando SelectMany() es corret. Para completar, aquí se está utilizando "la comprensión de consulta" sintaxis:

public static List<Content> FetchMenu(int websiteID) {
    return (from w in ContextHelper.Current.Websites
            where w.WebsiteID == websiteID
            from c in w.Contents
            select c).ToList();
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top