存储库中的特定查询

时间:2011-08-02 02:43:25

标签: linq-to-sql entity-framework-4 c#-3.0 repository-pattern

我一直在阅读有关存储库模式(Linq2SQL或EF)的大量内容。我已经看到了一些带有一些特定查询的存储库,例如FindUserByName,我将where表达式传递给存储库。

另一方面,我看到一些存储库只有“Save,Update和GetAll”而GetAll返回IQueryable。并且,此IQueryable在服务层中进行过滤。

那么,在您看来,将特定查询传递给存储库还是让它更简单并让所有过滤器都在服务中是否合适?

谢谢!

1 个答案:

答案 0 :(得分:2)

我的建议是创建一个GenericRepository<T>,其中包含核心基本方法(FindSaveDelete等。

示例:

public abstract class GenericRepository<T> : IRepository<T> where T : class
{
    public T FindSingle(Expression<Func<T,bool>> predicate) { .. };
    public IQueryable<T> Find() { .. };
    public void Delete(T entity) { .. };    
}

然后创建从泛型继承的特定存储库,以创建专门的方法。

示例:

public class EmployeeRepository : GenericRepository<Employee>, IRepository<Employee>
{
   public Employee FindByLastName(string lastName)
   {
      return FindSingle(emp => emp.LastName == lastName);
   }

   public ICollection<Employee> FindAllManagers()
   {
      return Find().Where(emp => emp.Type == "Manager").ToList();
   }

   // other methods...
}

这意味着您不会在您的存储库中复制公共代码。

是的,另一种选择是让服务在GenericRepository<T>之外运作。这意味着服务(基本上)是一个专门的存储库。

如果您需要服务层或专门的存储库,那么这只是一个偏好问题。