C# 如何使用NHibernate和存储库模式从域对象的属性返回分页列表
从文本来看,“存储库”模式是域和数据映射器层之间的中介。酷。例如,可能有一个存储库接口和基本域对象,如下所示C# 如何使用NHibernate和存储库模式从域对象的属性返回分页列表,c#,.net,nhibernate,domain-driven-design,C#,.net,Nhibernate,Domain Driven Design,从文本来看,“存储库”模式是域和数据映射器层之间的中介。酷。例如,可能有一个存储库接口和基本域对象,如下所示 public interface Repository<DomainT> where DomainT : DomainObject{ DomainT Get(Object id); } 或者二级缓存会使这个调用相对便宜,比如在收回300篇文章时,保留我的域模型 如果有3000或30000篇帖子,线程域模型上的帖子集合属性仍然有效吗 如果最好使用GetThreadP
public interface Repository<DomainT> where DomainT : DomainObject{
DomainT Get(Object id);
}
或者二级缓存会使这个调用相对便宜,比如在收回300篇文章时,保留我的域模型
- 如果有3000或30000篇帖子,线程域模型上的帖子集合属性仍然有效吗
- 如果最好使用GetThreadPosts&GetThreadPostCount,这是否意味着List的Thread对象上的属性是冗余的
- 如果一个对象上的列表属性只有在其可能拥有的项的数量不超过某个数量时才可行,那么我是否应该考虑一个限制
Andrew延迟加载的工作方式是,它将推迟数据库连接查询的执行,直到您访问Posts集合。现在,如果你打算在页面上只显示30篇文章,而数据库中有30000篇文章符合你的标准,那么加载所有的收集将是一种浪费 在我看来,分页应该在数据库级别完成。在本例中,我将从Thread类中删除Posts集合,Post应该属于一个线程,该线程将允许您构造查询。另外,一个方法足以获取分页帖子集合和帖子总数:
public IEnumerable<Post> GetPosts(object threadID, int pageSize, int index, out totalPosts)
{
var results = session
.CreateMultiCriteria()
.Add(GetCriteria(threadID)
.SetFirstResult((index - 1) * pageSize)
.SetMaxResults(pageSize)
)
.Add(GetCriteria(threadID)
.SetProjection(Projections.RowCount())
)
.List();
var counts = (IList)results[1];
totalPosts = (int)counts[0];
return ((IList)results[0]).Cast<Post>();
}
private DetachedCriteria GetCriteria(object threadID)
{
return DetachedCriteria
.For<Post>()
.Add(Expression.Eq("Thread.Id", threadID));
}
public IEnumerable GetPosts(对象threadID、int pageSize、int index、out totalPosts)
{
var结果=会话
.CreateMultiCriteria()
.Add(获取标准(线程ID)
.SetFirstResult((索引-1)*页面大小)
.SetMaxResults(页面大小)
)
.Add(获取标准(线程ID)
.SetProjection(Projections.RowCount())
)
.List();
var计数=(IList)结果[1];
totalPosts=(int)计数[0];
返回((IList)结果[0]).Cast();
}
private DetachedCriteria GetCriteria(对象线程ID)
{
返回分离条件
.对于()
.Add(Expression.Eq(“Thread.Id”,threadID));
}
谢谢您的解释。这听起来非常合乎逻辑!!:-)
GetThreadPosts(object threadID, int pageSize, int index);
GetThreadPostCount(object threadID);
public IEnumerable<Post> GetPosts(object threadID, int pageSize, int index, out totalPosts)
{
var results = session
.CreateMultiCriteria()
.Add(GetCriteria(threadID)
.SetFirstResult((index - 1) * pageSize)
.SetMaxResults(pageSize)
)
.Add(GetCriteria(threadID)
.SetProjection(Projections.RowCount())
)
.List();
var counts = (IList)results[1];
totalPosts = (int)counts[0];
return ((IList)results[0]).Cast<Post>();
}
private DetachedCriteria GetCriteria(object threadID)
{
return DetachedCriteria
.For<Post>()
.Add(Expression.Eq("Thread.Id", threadID));
}