我不知道我这样做是否正确,但这就是 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
方法,与此类似。我有 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/