你潜在的解决方案将在一个事务中进行处理,但将是两个数据库调用。如果您必须只有一个数据库调用,则应该使用多点查询/将来查询作为对等建议。有关未来语法的更多信息,请查看此帖:http://ayende.com/blog/3979/nhibernate-futures。
下面是实现您的方案的几种方法...
QueryOver(2调用数据库):
var query = session.QueryOver<Organism>();
var result = query
.Skip((Page - 1) * PageSize)
.Take(PageSize)
.List();
var rowcount = query.RowCount();
随着样本集100个生物,以及查询生物体11-20 ,这里被发送到数据库的两个查询:
SELECT TOP (@p0) Id0_0_, Title0_0_ FROM (SELECT this_.Id as Id0_0_, this_.Title as Title0_0_, ROW_NUMBER() OVER(ORDER BY CURRENT_TIMESTAMP) as __hibernate_sort_row FROM Organism this_) as query WHERE query.__hibernate_sort_row > @p1 ORDER BY query.__hibernate_sort_row;@p0 = 10 [Type: Int32 (0)], @p1 = 10 [Type: Int32 (0)]
SELECT count(*) as y0_ FROM Organism this_
QueryOver(1级分贝的呼叫与Future):
var query = session.QueryOver<Organism>()
.Skip((Page - 1) * PageSize)
.Take(PageSize)
.Future<Organism>();
var result = query.ToList();
var rowcount = session.QueryOver<Organism>()
.Select(Projections.Count(Projections.Id()))
.FutureValue<int>().Value;
查询对于相同组的数据作为之前的,这是产生的查询:
SELECT TOP (@p0) Id0_0_, Title0_0_ FROM (SELECT this_.Id as Id0_0_, this_.Title as Title0_0_, ROW_NUMBER() OVER(ORDER BY CURRENT_TIMESTAMP) as __hibernate_sort_row FROM Organism this_) as query WHERE query.__hibernate_sort_row > @p1 ORDER BY query.__hibernate_sort_row;SELECT count(this_.Id) as y0_ FROM Organism this_;;@p0 = 10 [Type: Int32 (0)], @p1 = 10 [Type: Int32 (0)]
标准(与Future1分贝呼叫):
var criteria = session.CreateCriteria<Organism>()
.SetFirstResult((Page - 1) * PageSize)
.SetMaxResults(PageSize)
.Future<Organism>();
var countCriteria = session.CreateCriteria<Organism>()
.SetProjection(Projections.Count(Projections.Id()))
.FutureValue<int>().Value;
再次,查询的相同的一组数据,标准与未来结果在同一查询中:
SELECT TOP (@p0) Id0_0_, Title0_0_ FROM (SELECT this_.Id as Id0_0_, this_.Title as Title0_0_, ROW_NUMBER() OVER(ORDER BY CURRENT_TIMESTAMP) as __hibernate_sort_row FROM Organism this_) as query WHERE query.__hibernate_sort_row > @p1 ORDER BY query.__hibernate_sort_row;SELECT count(this_.Id) as y0_ FROM Organism this_;;@p0 = 10 [Type: Int32 (0)], @p1 = 10 [Type: Int32 (0)]
请注意, e查询样式导致相同的查询。未来的语法只允许NHibernate进行一次数据库调用而不是两次。
如果您使用的是NHibernate 3,我认为最优雅的方式是使用新的QueryOver语法。 (你在你提出的解决方案中使用了旧的NHibernate.Linq语法,你最好学习QueryOver语法。)
可能值得注意的是,两者是否导致单个查询是由方言特定的优化驱动的。例如在SQLite上发出两个查询,但行为是相同的(所有的期货尽可能少地查询) – AlexCuse