2011-01-02 6 views
3

私は熱心な読み込みと投影の両方を含み、問題を抱えている簡単なクエリを実行しようとしています。私はCodeFirst CTP5を使用していますが、私はこの問題がまっすぐEF4にも影響すると信じています。EF4 Include()with Projection

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

これはヌルされる物品のカテゴリプロパティに結果:

はここに私の最初のクエリです。私が投影を取り出すと、それはうまく動作します。 thisを読んだ後、それは私が投影後に含める行う必要があることを示唆しているように見えるので、私はにクエリを変更:

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

これはthis SO postに似ている(下記参照)例外が発生します。

「タイプ 『System.Linq.IQueryable 1' to type 'System.Data.Objects.ObjectQuery 1』にキャストできません。エンティティへのLINQ は エンティティデータモデルのプリミティブ型のキャストをサポートしています。」

どうすればいいですか?

答えて

4

あなたは試みることができる:私は表示され単純化されたコードのために完璧に動作

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

おかげで、。現実には、この段階でToList()を実行するのではなく、Take()とSkip()をクエリに追加して実際に実行するPagedListコンストラクタにIQueryable を渡します。私は確かに、最初の部分でToList()をしないで、匿名型の代わりにtempエンティティを作成し、次にPagedListの処理を行い、最後にPagedList をPageList に変換するようにクエリを再配置できます。理想的ではない。他のオプションはありますか? –

+0

@ zaph0d:おそらくCategoryをArticleSummaryクラスに追加することができるので、TempArticleSummaryクラスを使う必要はありません。それは痛くないだろうか? – LukLed

+0

はい、それはきれいになるでしょう、そして、私は今、あなたの助けを大変感謝します。私はこのようにして私のモデルを汚染するのは好きではありませんが、EF4のジュリー・レーマンを見てみるといいかもしれません。 –