EF4 Linq tipo di ritorno elenco generico
-
26-09-2019 - |
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?
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();
}