Frage

Ich habe eine C # -4 MVC3 RC-Test-Anwendung, die 4 Entity Framework verwendet wird.

Ich habe diese Methode:

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

Die Objekte hier beteiligt (Content und Website) ist vom Typ EntityObject.

Die obige Funktion gibt Übersetzungsfehler:

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 ist eine EntityCollection<Content> Art Sammlung.

Wie aufschieben ich den Linq.IQueryable Typ eine generische Liste der Typ Inhalt zurück?

War es hilfreich?

Lösung

Sie müssen Klammern verwenden, so dass Sie ToList() auf die gesamte Abfrage (ein Objekt vom Typ IQueryable) gelten:

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

Ansonsten rufen Sie ToList() auf w.Contents nur und die select wird danach angewendet. Es könnte klarer, wenn ich die Methode Verkettungs Syntax zeigen.

Ihre Version:

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

Die korrekte Version:

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

Bearbeiten :

Da w.Contents eine Sammlung ist, müssen Sie es mithilfe SelectMany abzuflachen:

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

Andere Tipps

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

    return query.ToList();

Die .First () scheint den Trick zu tun ... Dank.

Yakimych Antwort SelectMany() verwendet, ist corret. Der Vollständigkeit halber hier wird es mit „Abfrage-“ Syntax:

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();
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top