EF4 Linq Rückgabetyp generische Liste
-
26-09-2019 - |
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?
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();
}