2010-11-20 25 views
0

ich eine C# -4 MVC3 RC-Test-Anwendung, die Entity Framework 4.EF4 Linq Rückgabetyp generische Liste

Ich habe diese Methode verwendet:

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) sind vom Typ EntityObject.

Die obige Funktion gibt Kompilierungsfehler:

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 verzögere ich den Linq.IQueryable-Typ, um eine allgemeine Liste des Typs Inhalt zurückzugeben?

Antwort

2

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(); 
} 

Andernfalls Sie anrufen ToList() auf w.Contents nur und die select wird danach angewendet. Es könnte klarer sein, wenn ich die Methodenkettensyntax zeige.

Ihre Version:

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

korrekte Version:

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

bearbeiten:

Seit w.Contents ist eine Sammlung, müssen Sie es SelectMany unter Verwendung abzuflachen:

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

ich in der Tat die Klammer vergessen, aber es gibt noch eine andere Konvertierungsfehler: Kann nicht implizit Typ ‚System.Collections.Generic.List > 'to' System.Collections.Generic.List ' – peter

0

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

+1

Mit der ersten Auswahl werden Sie nur ein Element aus jeder 'Contents'-Sammlung auswählen (für jede Website). Um alle Elemente zu erhalten, verwenden Sie 'SelectMany'. Siehe meinen aktualisierten Beitrag. – Yakimych

+0

Das dachte ich mir auch, aber .First() wählt auch alle Elemente aus. Ich denke, es bedeutet, dass es die erste Sammlung auswählen wird, die alle Inhaltselemente enthält. – peter

0

Yakimych's answer mit SelectMany() 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(); 
} 
Verwandte Themen