AutoMapper、Entity Framework 和计数

AutoMapper, Entity Framework and Counts

我正在尝试使用 AutoMapper 将我的分页 (https://www.nuget.org/packages/X.PagedList) 实体集合映射到我的 ViewModel。这可能更容易用代码解释:

模特:

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

现在,这行得通了。但是,正如一些人会很快指出的那样,当尝试获取订阅者的计数时,这会对列表中的每个条目进行新的数据库调用——所以如果页面大小很大(这显然是无论如何都是错误的)。我可以在抓取文章时添加 .Include(a => a.Subscribers),但是当我想要的只是计数时,这会引入很多不必要的数据(不是吗?)。我在这里明显遗漏了什么吗?

如果在这里使用 AutoMapper 是完全愚蠢的,请告诉我什么会更理智。

嘿,这行得通,而且还得出了一个非常好的 SQL 声明!

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

在您发表评论后修复,但无论如何还是感谢 Charles Mager :)