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?

Foi útil?

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();
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top