Domanda

Ho un C # -4 MVC3 RC test-applicazione che utilizza Entity Framework 4.

Ho questo metodo:

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

Gli oggetti coinvolti qui (Contenuto e sito web) sono di tipo EntityObject.

La funzione di cui sopra dà errore di compilazione:

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 è una collezione di tipo EntityCollection<Content>.

Come faccio a differire il tipo Linq.IQueryable per restituire un generico elenco di tipo Content?

È stato utile?

Soluzione

È necessario utilizzare parentesi, in modo che si applica a tutto il ToList() query (un oggetto di tipo IQueryable):

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

In caso contrario, si sta chiamando ToList() su w.Contents solo ed il select viene applicato in seguito. Potrebbe essere più chiaro se mostro la sintassi concatenamento metodo.

La versione:

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

versione corretta:

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

Modifica :

Dato w.Contents è una raccolta, è necessario appiattirla con l'ausilio di SelectMany:

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

Altri suggerimenti

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

    return query.ToList();

Il .Prima () sembra fare il trucco ... grazie.

di Yakimych risposta utilizzando SelectMany() è corret. Per completezza, qui si sta usando "richiesta di comprensione" sintassi:

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();
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top