存储库模式和IQueryable <t> </t>的性能

时间:2011-04-19 00:52:59

标签: asp.net-mvc asp.net-mvc-3 repository-pattern entity-framework-4.1

我不知道我是否正确这样做,但这就是我的存储库中Get方法的外观:

    public IQueryable<User> GetUsers(IEnumerable<Expression<Func<User, object>>> eagerLoading)
    {
        IQueryable<User> query = db.Users.AsNoTracking();

        if (eagerLoading != null)
        {
            foreach (var expression in eagerLoading)
            {
                query = query.Include(expression);
            }
        }            
        return query;
    }

让我们说我的GeographyRepository也有GetCountries方法,与此类似。

我有两个独立的服务层类,它们调用这两个独立的存储库,共享相同的DbContext(EF 4.1代码优先)。

所以在我的控制器中,我会这样做:

myViewModel.User = userService.GetUserById(1);
myViewModel.Countries = geoService.GetCountries();

这是对数据库的两次单独调用。如果我没有使用这些模式并占用接口和数据库,我将有1个电话。我想它的性能与可维护性有关。

我的问题是,这可以推送到1个数据库调用吗?当视图调用多个存储库时,我们可以合并这样的查询吗?

1 个答案:

答案 0 :(得分:5)

我会说,如果性能是真正的问题,那么我会尽量避免回到数据库。我假设从geoService.GetCountries()返回的列表是相当静态的,所以我倾向于在初始加载后将其缓存在服务中并完全删除数据库命中。你在那里获得服务的事实表明它将是抽象出这些细节的理想场所。

通常在询问有关性能的问题时,很少会使用相同的刷子来解决所有与性能相关的问题,并且您需要分析每种情况并针对您所遇到的特定性能问题找出合适的解决方案。