EF4 Linq type de retour de liste générique
-
26-09-2019 - |
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?
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();
}