在我的Repository方法中进行联接和其他复杂操作是一种好的做法吗



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

我目前正在构建由ADO.NET EFRepository类MyDBRepository:组成的DAL

public class MyDBRepository
{
    MyDBEntities myDB;
    public MinervaDBRepository()
    {
        myDB = new MyDBEntities();
    }
    //methods
}

我仍然不确定MyDBRepository方法执行的查询的详细程度。我知道这个查询在存储库中是合适的:

public IQueryable<Products> GetAllTickets()
{
     return myDB.products;
}

但是,那些通过导航属性使用联接的用户,或者使用其他类中的方法进行查询的用户呢?示例:

该方法检索到某个日期(日期以字符串形式存储在数据库中)之前被解雇的产品,并使用我创建的DateUtilities类:

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));
}

此方法使用导航属性执行联接以检索组成产品的所有部件(假设存在1对多关系):

 public IQueryable<Products> GetAllProductParts(int productId)
    {
        return myDB.products.Where(m => Equals(m.ProductId, productId));
    }

它们是在存储库类中实现的,还是最好(一个或两个)移动到服务层

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

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

相关内容

最新更新