Question

J'ai un C # -4 test de l'application MVC3 RC qui utilise Entity Framework 4.

J'ai cette méthode:

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

Les objets impliqués ici (contenu et site Web) sont de type EntityObject.

La fonction ci-dessus donne erreur de compilation:

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 est une collection de type EntityCollection<Content>.

Comment puis-je remettrai le type Linq.IQueryable pour retourner une liste générique de type de contenu?

Était-ce utile?

La solution

Vous devez utiliser des parenthèses, de sorte que vous appliquez ToList() à toute requête (un objet de type IQueryable):

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

Sinon, vous appelez ToList() sur w.Contents seulement et le select est appliqué par la suite. Il pourrait être plus clair si je montre la syntaxe enchaînant méthode.

Votre version:

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

La version correcte:

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

Modifier :

Depuis w.Contents est une collection, vous devez l'aplatir en utilisant SelectMany:

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

Autres conseils

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

    return query.ToList();

Le .Premier () semble faire l'affaire ... merci.

Yakimych de réponse en utilisant SelectMany() est Corret. Pour être complet, ici il utilise la syntaxe « compréhension de la requête »:

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();
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top