微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

asp.net-mvc – 我们应该使用Entity Framework Code First方法在MVC应用程序中使用Data Repository模式吗?

我现在已经使用Entity Framework Code First方法开发了许多应用程序.在所有我使用Data Repository模式.此Data Repository模式一次查询单个实体.例如,

我有2个型号
员工和部门

因此,为了获取所有员工和部门,我将创建2个数据存储库实例.例如

var empRepository = new DataRepository<Employee>();
var allEmployees = empRepository.GetAll();

var depRepository = new DataRepository<Department>();
var alldepartment = depRepository.GetAll();

现在,这种模式在大多数情况下都很有效.现在,当我想要执行连接时,我无法在此模式中执行此操作.我只有在获取了两个实体的所有记录之后才能执行连接,然后我可以在内存数据上使用连接.这会在我的逻辑中产生2个查询的额外开销.是否有任何人具有可与DataRepository模式一起使用的良好模式或解决方案.请建议任何替代此模式.

解决方法

实际上我昨天刚刚在我的通用存储库中实现了一个Join函数.这比每个人的实现方式要容易得多,并且您可以在这样做的同时使用Entity Framework的一些很酷的功能.

首先,我使用的是类似于我在this blog post中编写的存储库.您会注意到许多方法正在返回IQueryable.这不是偶然的. IQueryable将允许仍然使用延迟执行,这意味着查询将不会在数据库上运行,直到某些东西强制它(即循环或.ToList()调用).你会看到,将Join加入这种类型的存储库,你不会最终需要将所有实体加载到内存中来进行连接,因为你所暴露的只是一个IQueryable.

话虽这么说,这就是我在Join方法的可查询版本的基础上加入我的存储库的方法

public IQueryable<TResult> Join<TInner,TKey,TResult>(IRepository<TInner> innerRepository,Expression<Func<T,TKey>> outerSelector,Expression<Func<TInner,TKey>> innerSelector,TInner,TResult>> resultSelector) where TInner : class
{
  return DbSet.Join(innerRepository.All(),outerSelector,innerSelector,resultSelector);
}

然后,这只对数据库进行一次查询获取您正在请求的所有信息(同样,因为它只传递All()方法中的IQueryable).

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐