Futures in nHibernate Linq
本文关键字:Linq nHibernate in Futures | 更新日期: 2023-09-27 18:35:31
我对如何使用期货来计算 Linq 的东西的解决方案很感兴趣。我对标准 API 不感兴趣,只是普通的 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;
NHibernate不直接支持此功能,但非常容易实现(在此博客文章中进行了解释)。您需要编写一个新的扩展方法。
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()
应该是这样的:
var users = Session.Query<User>().ToFuture();
var totalCount = users.Count();