我正在C#中的ASP.NET MVC3中开发一个应用程序。
我目前正在构建由ADO.NET EF和Repository类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,或者只使用云存储)。