[英]MVC and repository pattern data efficiency
我的项目结构如下:
DAL
public IQueryable<Post> GetPosts()
{
var posts = from p in context.Post select p;
return posts;
}
服务
public IList<Post> GetPosts()
{
var posts = repository.GetPosts().ToList();
return posts;
}
//Returns a list of the latest feeds, restricted by the count.
public IList<PostFeed> GetPostFeeds(int latestCount)
{
List<Post> post - GetPosts();
//CODE TO CREATE FEEDS HERE
return feeds;
}
假设GetPostFeeds(5)应该返回5个最新的提要。 通过上列表,它不是从GetPosts()中提取数据库中的每个帖子,只是从中提取5个吗?
如果说每个帖子离数据库5kb,那么就有100万条记录。 难道每次GetPostFeeds()都会使用5GB的内存吗?
这是这样吗? 我是否应该返回DAL并编写仅返回我需要的查询?
只要您使用IQueryable
,就可以推迟查询执行。 一旦调用ToList()
或执行其他需要提取数据的操作(例如,遍历ToList()
便会执行查询。
我认为您不必为DAL担心太多,因为我希望它们保持相对的精简。 您可以通过重写GetPostFeeds
方法来利用延迟执行的优势,例如:
//Returns a list of the latest feeds, restricted by the count.
public IList<PostFeed> GetPostFeeds(int latestCount)
{
var posts = repository.GetPosts();
// Perform additional filtering here e.g:
posts = posts.Take(5);
return posts.ToList();
}
您会延迟执行,直到执行ToList()为止。 到那时,是的,整个套件和Caboodle都被拉下了。
如果要更智能地执行,请考虑消除ToList()
调用。 在整个调用链中使用IQueryables
将使您的存储库仅检索您需要的五条记录。
一旦只有五个记录,就可以调用ToList()
。
同意通过利用IQueryable可以避免返回整个表。 如果您不希望IQueryable泄漏出DAL,则可以考虑通过扩展协定将take()调用移至DAL中,以便DAL公开接受“ top n”参数的方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.