AutoMapperを使用して、エンティティのページされた(https://www.nuget.org/packages/X.PagedList)コレクションをViewModelにマップしようとしています。これは、コードと説明し、おそらく簡単です:AutoMapper、Entity FrameworkおよびCount
モデル:
public class Article {
public int Id { get; set; }
public string Title { get; set; }
// ...
public virtual ICollection<User> Subscribers { get; set; }
}
ビューモデル:
public class ArticleViewModel {
public class ArticleListEntry {
public int Id { get; set; }
public string Title { get; set; }
// ...
public int SubscribersCount { get; set; }
}
// ...
public IPagedList<ArticleListEntry> ArticleList { get; set; }
}
マッピング設定:
CreateMap<Article, ArticleViewModel.ArticleListEntry>();
コントローラー:
public ActionResult Index(int? page) {
int pageSize = 25;
int pageNumber = (page ?? 1);
var model = new ArticleViewModel();
IQueryable<Article> articles = db.Articles.OrderBy(a => a.Title);
model.Articles = Mapper.Map<IPagedList<Article>, IPagedList<ArticleViewMode.ArticleListEntry>>(articles).ToPagedList(pageNumber, pageSize);
return View(model);
}
これで動作します。しかし、一部の人々がすぐに指摘するように、これは、サブスクライバのカウントを取得しようとすると、リスト内の各エントリに対して新しいデータベース呼び出しを行います。したがって、ページサイズが大きい場合は2〜3秒かかる間違っていても)。私は記事をつかむときに.Include(a => a.Subscribers)
を追加することができますが、これはたくさんの不要なデータを取り込みます(そうではありませんか?私はここに欠けている何かが明らかですか?
ここでAutoMapperを使用している場合は、完全に愚かなので、私に教えてください。
私はこの問題は、あなたのToPagedList()メソッドにあるのかもしれないと思う直後。あなたはそのコードを投稿できますか? – Spivonious
その結果をAutoMapperに渡す前に、記事のToList()を使ってクエリを実行します。 – Oscar
['ProjectTo'](https://github.com/AutoMapper/AutoMapper/wiki/Queryable-Extensions)を見てみてください。 –