Lista genérica do tipo de retorno linq ef4
-
26-09-2019 - |
Pergunta
Eu tenho uma aplicação de teste C#-4 MVC3 RC que está usando o Entity Framework 4.
Eu tenho esse método:
public static List<Content> FetchMenu(int websiteID) {
return (from w in ContextHelper.Current.Websites
where w.WebsiteID == websiteID
select w.Contents).ToList();
}
Os objetos envolvidos aqui (conteúdo e site) são do Type EntityObject.
A função acima fornece erro de compilação:
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 é um EntityCollection<Content>
coleção de tipos.
Como faço para adiar o tipo Linq.iqueyable para retornar uma lista genérica do conteúdo do tipo?
Solução
Você precisa usar parênteses, para que você se inscreva ToList()
para toda a consulta (um objeto do tipo IQueryable
):
public static List<Content> FetchMenu(int websiteID) {
return (from w in ContextHelper.Current.Websites
where w.WebsiteID == websiteID
select w.Contents).ToList();
}
Caso contrário, você está ligando ToList()
sobre w.Contents
apenas e o select
é aplicado posteriormente. Pode ficar mais claro se eu mostrar a sintaxe de encadeamento do método.
Sua versão:
ContextHelper.
Current.
Websites.
Where(w => w.WebsiteID == websiteID).
Select(w => w.Contents.ToList());
Versão correta:
ContextHelper.
Current.
Websites.
Where(w => w.WebsiteID == websiteID).
Select(w => w.Contents).
ToList();
Editar:
Desde w.Contents
é uma coleção, você precisa achatá -la usando SelectMany
:
public static List<Content> FetchMenu(int websiteID) {
return ContextHelper.
Current.
Websites.
Where(w => w.WebsiteID == websiteID).
SelectMany(w => w.Contents).
ToList();
}
Outras dicas
var query = (from w in ContextHelper.Current.Websites
where w.WebsiteID == websiteID
select w.Contents).First();
return query.ToList();
O. Primeiro () parece fazer o truque ... obrigado.
A resposta de Yakimych usando SelectMany()
é Corret. Para completude, aqui está usando a sintaxe "Compreensão da Consulta":
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();
}