2012-05-29 77 views
1

我很感興趣的解決方案如何使用期貨計算有Linq的事情。我對Criteria API不感興趣,只是簡單的linq。nHibernate中的期貨Linq

如果我有:

IEnumerable<User> dbUsers = userquery.Future<User>(); 
IFutureValue<long> count = totalcountQuery.FutureValue<long>(); 

直接翻譯應該是:

var dbUsers = userQuery.ToFuture();  
var count = userQuery.LongCount(); 

現在我需要訪問數查詢知道的人口記錄確切的數字;

這樣的事情,雖然這個代碼不會編譯:

totalRecords = (int)count.Value; 

回答

1

這不是直接由NHibernate的支持,但它是非常容易實現的(在這個blog post中解釋)。你需要編寫一個新的擴展方法。

public static IFutureValue<TResult> ToFutureValue<TSource, TResult> 
     (this IQueryable<TSource> source, Expression<Func<IQueryable<TSource>, TResult>> selector) 
     where TResult:struct where TSource: class 
    { 
     var provider = (INhQueryProvider) source.Provider; 
     var method = ((MethodCallExpression) selector.Body).Method; 
     var expression = Expression.Call(null, method, source.Expression); 
     return (IFutureValue<TResult>) provider.ExecuteFuture(expression); 
    } 

那麼很容易得到一個分頁查詢

var query = session.Query<User>().Where(...); 
var count = query.ToFutureValue(u => u.Count()); 
var results = query.OrderBy(u => u.FullName).Skip(n).Take(m).ToFuture() 
0

應該是這樣的:

var users = Session.Query<User>().ToFuture(); 
var totalCount = users.Count();