gpt4 book ai didi

c# - 如何使用 NHibernate 和存储库模式从域对象的属性返回分页列表

转载 作者:行者123 更新时间:2023-11-30 12:37:24 24 4
gpt4 key购买 nike

摘自文本“存储库”模式是域和数据映射层之间的中介。凉爽的。因此,例如,可能有一个 Repository 接口(interface)和 Base Domain Object 像这样

public interface Repository<DomainT> where DomainT : DomainObject{
DomainT Get(Object id);
}

那么具体的实现就是

public class ThreadRepository : Repository<Thread>{
public Order Get(Object id){
return _session.Find(typeof(Thread),id);
}
}

现在我的问题是,一个线程可以有很多帖子,比如 StackOverflow,假设这个线程有 300 个帖子。使用上面的语句,我将获得 Thread 对象,我只想显示 20 个项目的列表,因此我将访问 Thread 对象的 Post Collection 属性,由于 LazyLoading 将获取所有 300 个项目,以供我处理我怎么高兴。

在 Repository 上有一个名为

的方法会更有效吗?
GetThreadPosts(object threadID, int pageSize, int index);
GetThreadPostCount(object threadID);

或者二级缓存是否会使这个调用相对便宜,因为在取回 300 个帖子时,保留了我的领域模型。

  • 如果有 3000 或 30,000 个帖子,线程域模型上的帖子集合属性是否仍然有效?

  • 如果有 GetThreadPosts 和 GetThreadPostCount 更好,这是否意味着 List 的 Thread 对象上的属性是多余的?

  • 我是否应该考虑限制对象上的 List 属性何时仅在说它可能拥有的项目数量不超过特定数量时才可行?

谢谢你的时间,

安德鲁

最佳答案

延迟加载的工作方式是它将延迟数据库连接查询的执行,直到您访问 Posts 集合。现在,如果您打算在页面上只显示 30 篇文章,而数据库中有 30000 篇文章满足您的条件,加载所有集合将是一种浪费。

在我看来,分页应该在数据库级别完成。在这种情况下,我会从 Thread 类中删除 Posts 集合,而 Post 应该属于一个 Thread,这将允许您构建查询。还有一个 single方法足以获取分页的 Posts 集合和帖子总数:

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

关于c# - 如何使用 NHibernate 和存储库模式从域对象的属性返回分页列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1181796/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com