当前位置 : 主页 > 网络编程 > ASP >

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

来源:互联网 收集:自由互联 发布时间:2021-06-24
我现在已经使用Entity Framework Code First方法开发了许多应用程序.在所有我使用Data Repository模式.此Data Repository模式一次查询单个实体.例如, 我有2个型号 员工和部门 因此,为了获取所有员工
我现在已经使用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, Expression<Func<T, TInner, TResult>> resultSelector) where TInner : class
{
  return DbSet.Join(innerRepository.All(), outerSelector, innerSelector, resultSelector);
}

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

网友评论