C# NHibernate分页性能(更好的选项)
在这种简单的情况下:C# NHibernate分页性能(更好的选项),c#,nhibernate,paging,C#,Nhibernate,Paging,在这种简单的情况下: public class Person { public int Id {get;set;} public int Name {get;set;} } 我需要生成一个带有分页和排序的网格 我的数据库大约有10万人 哪个选项性能更好: 1)第一次获取所有元素,然后利用NHibernate一级缓存,例如: personRep.FindAll().OrderBy(s =>s.Name).AsPagination(pageNumber,pageSiz
public class Person
{
public int Id {get;set;}
public int Name {get;set;}
}
- 我需要生成一个带有分页和排序的网格
- 我的数据库大约有10万人
personRep.FindAll().OrderBy(s =>s.Name).AsPagination(pageNumber,pageSize);
Obs.:AsPagination是一种扩展方法
2)仅从数据库获取实际页面,例如:
public virtual IList<T> GetPaginedList(int __pageIndex, int __pageSize,out int __total)
{
var _rowCount = Session.CreateCriteria(typeof(T))
.SetProjection(Projections.RowCount()).FutureValue<Int32>();
var _results = Session.CreateCriteria(typeof(T))
.SetFirstResult(__pageIndex * __pageSize)
.SetMaxResults(__pageSize)
.Future<T>();
__total = _rowCount.Value;
return _results;
}
public虚拟IList GetPaginedList(int\u页面索引、int\u页面大小、out int\u总计)
{
var_rowCount=Session.CreateCriteria(typeof(T))
.SetProjection(Projections.RowCount()).FutureValue();
var_results=Session.CreateCriteria(typeof(T))
.SetFirstResult(_页面索引*_页面大小)
.SetMaxResults(uu页面大小)
.Future();
__总计=_rowCount.Value;
返回结果;
}
与许多数据检索性能问题一样,哪一个更好取决于使用场景
如果用户可能在数据变得太陈旧而无法使用之前仔细阅读大部分或所有页面,则选项1会更好。在总结果集相对较小(2-3页)和结果集变化不大(即从数据库中提取用户权限)的情况下,它也会更好,允许您将整个数据集长期存储在内存中,通过消除网络往返来提高未来运行的性能
选项2更适合于涉及长数据页和/或总结果集、“宽”记录的情况,或者数据变化频繁以至于本地缓存效果不佳的情况。它将检索记录的成本分摊到结果集的整个使用过程中,达到显示记录所需的程度。这种分页结果的“延迟加载”确实会增加获取记录的总时间和开销(因为往返次数较多),但用户更可能注意到并抱怨搜索结果的10秒周转时间比每页半秒长。与许多数据检索性能问题一样,其中哪一个更好将取决于使用场景 如果用户可能在数据变得太陈旧而无法使用之前仔细阅读大部分或所有页面,则选项1会更好。在总结果集相对较小(2-3页)和结果集变化不大(即从数据库中提取用户权限)的情况下,它也会更好,允许您将整个数据集长期存储在内存中,通过消除网络往返来提高未来运行的性能
选项2更适合于涉及长数据页和/或总结果集、“宽”记录的情况,或者数据变化频繁以至于本地缓存效果不佳的情况。它将检索记录的成本分摊到结果集的整个使用过程中,达到显示记录所需的程度。这种分页结果的“延迟加载”确实会增加获取记录的总时间和开销(因为往返次数较多),但用户更可能注意到并抱怨搜索结果的10秒周转时间比每页半秒长。第二个选项最合适 当您(用户)甚至没有“使用”所有这些实例时,一次性检索所有实例是没有用的 如果“Person”类是一个有很多关联的“重”类,那么创建一个“PersonView”类就更好了,它只包含要在网格中显示的属性 您不必映射
PersonView
类,只需“导入”它,以便NHibernate知道它的存在。
然后,在Person
类上创建一个查询,并定义必须使用AliasToBean Transformer
将Person
实例转换为PersonView实例
通过这样做,NHibernate将能够生成一个查询,该查询只从数据库中检索必要的列,并用它填充
PersonView
实例。第二个选项将是最合适的
当您(用户)甚至没有“使用”所有这些实例时,一次性检索所有实例是没有用的
如果“Person”类是一个有很多关联的“重”类,那么创建一个“PersonView”类就更好了,它只包含要在网格中显示的属性
您不必映射PersonView
类,只需“导入”它,以便NHibernate知道它的存在。
然后,在Person
类上创建一个查询,并定义必须使用AliasToBean Transformer
将Person
实例转换为PersonView实例
通过这样做,NHibernate将能够生成一个查询,该查询只从数据库中检索必要的列,并使用它填充
PersonView
实例。嗨,Frederik,你能告诉我如何“导入”视图并查询它吗?谢谢Shi Paul,我在这里用一个代码示例回答了一个类似的问题:嗨,Frederik,你能告诉我如何“导入”视图并查询它吗?谢谢Shi Paul,我在这里用一个代码示例回答了一个类似的问题: