次の2つのクエリをデータベースへの単一のラウンドトリップで実行する必要があるため、ToFutureValueを使用しています。
var query = AsQueryable()
.Where(x => x.User == user);
var singinCount = query
.Where(x => x.ActionDate >= from && x.ActionDate <= to)
.ToFutureValue(q => q.Count());
var lastSignin = query
.Where(x => x.ActionName.ToLower() == Actions.Signin))
.ToFutureValue(q => q.Max(x => x.ActionDate));
問題は、CountとMaxが結果を返すが、IQueryableは返さないことです。CountをToFutureValueに渡すことができる次の拡張機能を見つけました。
public static IFutureValue<TResult> ToFutureValue<TSource, TResult>(
this IQueryable<TSource> source, Expression<Func<IQueryable<TSource>, TResult>> selector)
where TResult : struct
{
var provider = (INhQueryProvider)source.Provider;
var method = ((MethodCallExpression)selector.Body).Method;
var expression = Expression.Call((Expression)null, method, source.Expression);
return (IFutureValue<TResult>)provider.ExecuteFuture(expression);
}
Maxに引数を渡す必要があるため、Maxにその拡張機能を採用する必要があります(.ToFutureValue(q => q.Max(x => x.ActionDate)))。どうやってやるの?