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

Sha*_*ean 4 asp.net-mvc repository-pattern entity-framework-4.1 asp.net-mvc-3

我不知道我是否正确这样做,但这就是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;
    }
Run Code Online (Sandbox Code Playgroud)

比方说,我也有一个GeographyRepositoryGetCountries法,这是与此类似.

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

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

myViewModel.User = userService.GetUserById(1);
myViewModel.Countries = geoService.GetCountries();
Run Code Online (Sandbox Code Playgroud)

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

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

lom*_*axx 5

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

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