2016-11-06 83 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