asp.net-mvc - 存储库模式和 IQueryable<T> 的性能

标签 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;
    }

假设我也有一个 GeographyRepositoryGetCountries方法,与此类似。

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

所以在我的 Controller 中,我会这样做:
myViewModel.User = userService.GetUserById(1);
myViewModel.Countries = geoService.GetCountries();

这是对数据库的 2 次单独调用。如果我不使用这些模式并绑定(bind)接口(interface)和数据库,我会打 1 个电话。我猜它是一种性能与可维护性。

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

最佳答案

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

通常,在询问有关性能的问题时,很少有所有与性能相关的问题都可以用同一个刷子来解决,您需要分析每种情况并为您遇到的特定性能问题制定适当的解决方案。

关于asp.net-mvc - 存储库模式和 IQueryable<T> 的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5710418/

相关文章:

entity-framework - 存储库模式 : Deleting the aggregate root

asp.net-mvc - 我的 Razor View 的自定义基本页面类型,如何使用城堡温莎 Autowiring 属性?

c# - 我们如何在asp.net mvc-6核心中实现 "Bell Notification"

asp.net-mvc - 在 MVC3 中使用 Workflow Foundation 来处理页面流(如在向导中)

asp.net-mvc-3 - MVC 3客户端验证,模型绑定(bind)十进制值和文化(不同的小数分隔符)

c# - 需要有关 MVC 中 AJAX 表单流程的建议

entity-framework - 如何聚合存储库?

c# - 使用 IEnumerable<Interface> 类型参数发布到 Web API 操作

.net - 如何将 Twitter 和 Facebook 帖子聚合到 Orchard 博客?

asp.net-mvc-4 - 通过将ViewModel发送到 Controller 来更新存储库模式模型-如何发送回上下文?