Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用NHibernate和存储库模式从域对象的属性返回分页列表_C#_.net_Nhibernate_Domain Driven Design - Fatal编程技术网

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