2011-01-02 3 views
3

J'essaie de faire une requête simple qui implique à la fois le chargement et la projection impatients et j'ai des problèmes. J'utilise CodeFirst CTP5 mais je crois que ce problème affecte également EF4 droit.EF4 Inclure() avec Projection

Voici ma question initiale:

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

Il en résulte la propriété de la catégorie de l'article étant nul. Si je retire la projection, ça fonctionne très bien. Après avoir lu this, il semble suggérer que je dois faire l'inclure après la projection, donc je changé la requête:

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

Il en résulte une exception (voir ci-dessous) qui est similaire à this SO post.

"Impossible de lancer le type 'System.Linq.IQueryable 1' to type 'System.Data.Objects.ObjectQuery 1'. LINQ to Entities prend uniquement en charge coulée Entity Data Model types primitifs."

Alors, comment faire?

Répondre

4

Vous pouvez essayer:

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

Merci, qui fonctionne parfaitement pour le code simplifié que j'AFFICHE. En réalité, je ne fais pas de ToList() à ce stade mais je passe un IQueryable dans un constructeur PagedList qui ajoute Take() et Skip() à la requête et l'exécute réellement. Je peux certainement réorganiser la requête de sorte que je ne fais pas ToList() dans la première partie, créer une entité temp au lieu du type anonyme, puis faire le PagedList et finalement convertir le PagedList en PageList mais ceci est pas idéal. Il y a-t-il des alternatives? –

+0

@ zaph0d: Vous pouvez probablement ajouter une classe Category à ArticleSummary, vous n'aurez donc pas besoin d'utiliser la classe TempArticleSummary. Cela ne ferait pas de mal, n'est-ce pas? – LukLed

+0

Oui, ce serait plus propre et c'est ce que je ferai pour l'instant, merci beaucoup pour votre aide. Je n'aime pas polluer mon modèle de cette façon, alors j'essaierai de faire appel à Julie Lerman, gourou de l'EF4. –