Entity framework 在我的存储库方法中加入联接和其他复杂操作是一种好的做法吗?

Entity framework 在我的存储库方法中加入联接和其他复杂操作是一种好的做法吗?,entity-framework,repository-pattern,abstraction,Entity Framework,Repository Pattern,Abstraction,我正在用C#在ASP.NET MVC3中开发一个应用程序 我目前正在构建我的DAL,它由ADO.NET EF和一个存储库类MyDBRepository组成: public class MyDBRepository { MyDBEntities myDB; public MinervaDBRepository() { myDB = new MyDBEntities(); } //methods } 我仍然不确定MyDBRepositor

我正在用C#在ASP.NET MVC3中开发一个应用程序

我目前正在构建我的DAL,它由ADO.NET EF和一个存储库类
MyDBRepository
组成:

public class MyDBRepository
{
    MyDBEntities myDB;

    public MinervaDBRepository()
    {
        myDB = new MyDBEntities();
    }

    //methods
}
我仍然不确定
MyDBRepository
方法执行的查询的详细程度。我知道此查询适用于存储库:

public IQueryable<Products> GetAllTickets()
{
     return myDB.products;
}
此方法使用导航属性执行连接,以检索构成产品的所有零件(假设存在1对多关系):

公共IQueryable GetAllProductParts(int-productId) { 返回myDB.products.Where(m=>等于(m.ProductId,ProductId)); }
它们是在存储库类中实现还是最好(一个或两个)移动到服务层?

存储库封装了持久层,在那里实现与数据库相关的所有内容是正常的。实际执行情况不一致;对于应用程序的其余部分来说并不重要,这就是为什么您首先要使用存储库。我唯一建议更改的是直接返回IEnumerable,而不是IQueryable

它们之间有区别,但在这种情况下这并不重要,使用IQueryable意味着将来更难更改持久性访问(例如,您可能希望切换到micro orm或更改驱动程序不支持IQueryable的RDBMS,或者只使用云存储)

public IQueryable<Products> GetProductsDismissed(DateTime date) 
{
        return myDB.products.Where(m => (string.IsNullOrEmpty(m.ProductDismissDate) || 
                                        Equals(m.ProductDismissDate, "-")) ? false :
              (DateTime.Compare(date, DateUtilities.ConvertToDateTime(m.ProductDismissDate)) > 0));
}
 public IQueryable<Products> GetAllProductParts(int productId)
    {
        return myDB.products.Where(m => Equals(m.ProductId, productId));
    }