EF4 LINQ tipo de retorno lista genérica
-
26-09-2019 - |
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?
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.
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();
}