public override void OnActionExecuted(HttpActionExecutedContext context) { var qs = QueryFns.ExtractAndDecodeQueryString(context); if (qs == null) { base.OnActionExecuted(context); return; } var queryable = QueryFns.ExtractQueryable(context); if (queryable == null) { base.OnActionExecuted(context); return; } var eq = new EntityQuery(qs); var eleType = TypeFns.GetElementType(queryable.GetType()); eq.Validate(eleType); int?inlineCount = null; var originalQueryable = queryable; queryable = eq.ApplyWhere(queryable, eleType); IFutureValue <int> inlineCountFuture = null; if (eq.IsInlineCountEnabled) { if (UseFuture) { var countExpr = GetCountExpressionMethod.MakeGenericMethod(eleType).Invoke(this, new object[0]); inlineCountFuture = (IFutureValue <int>)ToFutureValueMethod.MakeGenericMethod(eleType, typeof(int)) .Invoke(null, new[] { queryable, countExpr }); } else { inlineCount = (int)Queryable.Count((dynamic)queryable); } } queryable = eq.ApplyOrderBy(queryable, eleType); queryable = eq.ApplySkip(queryable, eleType); queryable = eq.ApplyTake(queryable, eleType); queryable = eq.ApplySelect(queryable, eleType); queryable = eq.ApplyExpand(queryable, eleType); if (queryable != originalQueryable) { // if a select or expand was encountered we need to // execute the DbQueries here, so that any exceptions thrown can be properly returned. // if we wait to have the query executed within the serializer, some exceptions will not // serialize properly. dynamic listResult; if (UseFuture) { var future = ToFutureMethod.MakeGenericMethod(eleType).Invoke(null, new object[] { queryable }); listResult = Enumerable.ToList((dynamic)future.GetType().GetMethod("GetEnumerable").Invoke(future, new object[0])); } else { listResult = Enumerable.ToList((dynamic)queryable); } var qr = new QueryResult(listResult, inlineCountFuture?.Value ?? inlineCount); if (CloseSession) { var session = GetSession(queryable); if (session != null) { Close(session); } } context.Response = context.Request.CreateResponse(HttpStatusCode.OK, qr); } base.OnActionExecuted(context); }