我知道这个问题问了很多(我想),但我找不到最聪明的程序员(谷歌)的明确答案。 我已经实现了一些存储库(不是通用的)但是每个实体一个。
public class Person
{
public string Name { get; set; }
public int Id { get; set; }
}
public class Product
{
public int ProductId { get; set; }
}
public class PersonRepository
{
ISession Session { get; set; }
public Person GetById(int id)
{
//...
}
public IEnumerable<Person> GetAll()
{
//...
}
}
public class ProductRepository
{
ISession Session { get; set; }
public Product GetById(int id)
{
//...
}
public IEnumerable<Product> GetAll()
{
//...
}
}
public class PostOfficeService
{
ProductRepository _rep1 = new ProductRepository();
PersonRepository _rep2 = new PersonRepository();
public IEnumerable<Person> GetAllPersonWithSameIdAsProduct()
{
_rep1.GetAll().Where( ... )
// ??? i want it to perform the query in the DB and not two queries in app memory
}
}
我应该使用工作单位模式吗? 那里有很多数据和信息,但不能把我的手指放在&#34;右边&#34;解 或者它是一个很好的解决方案?
答案 0 :(得分:1)
工作单位模式与交易有关 - 我无法看到它与此问题的关系。
GetAllPersonWithSameIdAsProduct
应该是您PersonRepository
之一的方法 - 或者是第三个更高级的存储库 - 因为,在存储库级别之上,您无权访问该会话。另一种方法是使您的存储库接受ICriteria
参数,并使用条件构建器类来创建复杂查询。
但是,使用LINQ-To-NHibernate会使IQueryable实现成为您的存储库,从而更容易解决这些问题,并且您的Service类可以使用LINQ进行查询,而无需知道他们正在与数据库通信。