繁体   English   中英

MVC和存储库模式数据效率

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM