2016-05-23 12 views
0

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を使用している場合は、完全に愚かなので、私に教えてください。

+0

私はこの問題は、あなたのToPagedList()メソッドにあるのかもしれないと思う直後。あなたはそのコードを投稿できますか? – Spivonious

+0

その結果をAutoMapperに渡す前に、記事のToList()を使ってクエリを実行します。 – Oscar

+1

['ProjectTo'](https://github.com/AutoMapper/AutoMapper/wiki/Queryable-Extensions)を見てみてください。 –

答えて

1

こんにちは、これは動作し、本当に素晴らしいSQL文も出てきます!固定

model.Articles = db.Articles.OrderBy(a => a.Title).ProjectTo<ArticleViewMode.ArticleListEntry>().ToPagedList(pageNumber, pageSize); 

あなたはcommentsdが、おかげでとにかくチャールズMager :)

関連する問題