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 :)
我正在尝试使用 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 :)