2016-11-06 59 views
1

我们使用ICriteria现在我们想切换到更具可读性QueryOver NHibernate的NHibernate的迁移的ICriteria到QueryOver

有人可以给我一个提示如何将这种通用的分页逻辑的ICriteria到QueryOver转换?

public static PagedList<T> PagedList<T>(this ICriteria criteria, 
    ISession session, int pageIndex, int pageSize) where T : class 
{ 
    if (pageIndex < 0) 
     pageIndex = 0; 

    var countCrit = (ICriteria)criteria.Clone(); 
    countCrit.ClearOrders(); // so we don’t have missing group by exceptions 

    var results = session.CreateMultiCriteria() 
     .Add<long>(countCrit.SetProjection(Projections.RowCountInt64())) 
     .Add<T>(criteria.SetFirstResult(pageIndex * pageSize).SetMaxResults(pageSize)) 
     .List(); 

    var totalCount = ((IList<long>)results[0])[0]; 

    return new PagedList<T>((IList<T>)results[1], totalCount, pageIndex, pageSize); 
} 
+0

请让我们知道您尝试了什么以及那个问题是什么。 –

回答

1

我使用它的方式:

var session = ... // get a ISession 

// the QueryOver 
var query = session.QueryOver<MyEntity>(); 
// apply all filtering, sorting... 
query... 

// GET A ROW COUNT query (ICriteria) 
var rowCount = CriteriaTransformer.TransformToRowCount(query.UnderlyingCriteria); 

// ask for a list, but with a Future, to combine both in one SQL statement 
var list = query 
    .Future<MyEntity>() 
    .ToList(); 

// execute the main and count query at once 
var count = rowCount 
    .FutureValue<int>() 
    .Value; 

// list is now in memory, ready to be used 
var list = futureList 
    .ToList(); 

所以,我们使用QueryOver,并从根本标准和变压器获利。使用Future,我们也可以在一个命令中执行所有操作。

+1

不错的解决方案,会尝试使用它 – senzacionale