2011-01-02 12 views
3

Ich versuche, eine einfache Abfrage, die sowohl eifrig laden und Projektion und habe Probleme haben. Ich verwende CodeFirst CTP5, aber ich nehme an, dass dieses Problem auch gerade EF4 betrifft.EF4 Include() mit Projektion

Hier ist meine erste Abfrage:

public List<ArticleSummary> GetArticles() 
    { 
     var articlesQuery = _db.Articles.Include(article => article.Category).Select(article => new ArticleSummary 
     { 
      Article = article, 
      CommentsCount = article.Comments.Count 
     }); 

     return articlesQuery.ToList(); 
    } 

Dies führt in der Kategorie Eigenschaft des Artikels ist null. Wenn ich die Projektion herausnehme, funktioniert es gut. Nach der Lektüre this, so scheint es, zu behaupten, dass ich tun muss, die sind nach der Projektion, also habe ich die Abfrage:

public List<ArticleSummary> GetArticles() 
    { 
     var articlesQuery = _db.Articles.Select(article => new ArticleSummary 
     { 
      Article = article, 
      CommentsCount = article.Comments.Count 
     }); 

     articlesQuery = articlesQuery.Include(x => x.Article.Category); 

     return articlesQuery.ToList(); 
    } 

Dies führt zu einer Ausnahme (siehe unten), die zu this SO post ähnlich ist.

"Kann nicht den Typ 'System.Linq.IQueryable 1' to type 'System.Data.Objects.ObjectQuery 1'. LINQ to Entities werfen nur Entity Data Model primitive Typen unterstützt Gießen."

Also, wie mache ich das?

Antwort

4

Sie könnten versuchen:

public List<ArticleSummary> GetArticles() 
{ 
    var articlesQuery = _db.Articles.Select(article => new 
     { 
      Article = article, 
      Category = article.Category 
      CommentsCount = article.Comments.Count 
     } 
    ).ToList(). 
    Select(
     x => new ArticleSummary() 
     { 
      Article = x.Article, 
      CommentsCount = x.CommentsCount 
     } 
    ); 

    return articlesQuery.ToList(); 
} 
+0

Danke, das perfekt für den vereinfachten Code funktioniert, die ich angezeigt. In Wirklichkeit mache ich zu diesem Zeitpunkt keine ToList(), sondern übergebe stattdessen ein IQueryable an einen PagedList-Konstruktor, der die Abfrage um Take() und Skip() ergänzt und sie tatsächlich ausführt. Ich kann die Abfrage sicherlich neu anordnen, so dass ich ToList() im ersten Teil nicht mache, eine temporäre Entität anstelle des anonymen Typs erstelle, dann das PagedList-Zeug mache und schließlich die PagedList in PageList umwandelt nicht ideal. Gibt es noch andere Möglichkeiten? –

+0

@ zaph0d: Sie könnten der ArticleSummary-Klasse wahrscheinlich eine Kategorie hinzufügen, sodass Sie die TempArticleSummary-Klasse nicht benötigen würden. Das würde nicht weh tun, oder? – LukLed

+0

Ja, das wäre sauberer und es ist, was ich für jetzt tun werde, also vielen Dank für Ihre Hilfe. Ich mag es nicht, mein Modell auf diese Weise zu verschmutzen, aber versuche vielleicht, den EF4-Guru Julie Lerman dazu zu bringen, einen Blick darauf zu werfen. –