/// <summary> /// Executes the NHibernate query and initializes the lazy proxies before serialization /// </summary> /// <param name="actionExecutedContext"></param> public override void OnActionExecuted(System.Web.Http.Filters.HttpActionExecutedContext actionExecutedContext) { if (actionExecutedContext.Response == null) { return; } object responseObject; if (actionExecutedContext.Response == null || !actionExecutedContext.Response.TryGetContentValue(out responseObject)) { return; } if (responseObject is IQueryable) { var nhQueryable = responseObject as IQueryableInclude; if (nhQueryable != null) { // perform expansion based on the Include() clauses var includes = nhQueryable.GetIncludes(); if (includes != null) { this.ApplyExpansions(nhQueryable, includes, actionExecutedContext.Request); } } var returnType = actionExecutedContext.ActionContext.ActionDescriptor.ReturnType; if (typeof(IEnumerable).IsAssignableFrom(returnType)) { // Apply $select and $expand in the base class base.OnActionExecuted(actionExecutedContext); if (!actionExecutedContext.Response.TryGetContentValue(out responseObject)) { return; } var queryResult = responseObject as QueryResult; if (queryResult != null) { responseObject = queryResult.Results; } var list = Enumerable.ToList((dynamic)responseObject); var expandMap = GetRequestProperty(actionExecutedContext.Request, EXPAND_MAP_KEY) as ExpandTypeMap; // Initialize the NHibernate proxies NHInitializer.InitializeList(list, expandMap); if (queryResult != null) { // Put the results in the existing wrapper queryResult.Results = list; } else { // replace the IQueryable with the executed list, so it won't be re-executed by the serializer var formatter = ((dynamic)actionExecutedContext.Response.Content).Formatter; var oc = new ObjectContent(list.GetType(), list, formatter); actionExecutedContext.Response.Content = oc; } } else { // Execute the query for a non-enumerable type var result = Enumerable.ToList((dynamic)responseObject); // replace the IQueryable with the executed list, so it won't be re-executed by the serializer var formatter = ((dynamic)actionExecutedContext.Response.Content).Formatter; var oc = new ObjectContent(result.GetType(), result, formatter); actionExecutedContext.Response.Content = oc; } } // Even with no IQueryable, we still need to configure the formatter to prevent runaway serialization. ConfigureFormatter(actionExecutedContext.Request); }
/// <summary> /// Perform the lazy loading allowed in the expandMap. /// </summary> /// <param name="list"></param> public override IEnumerable PostExecuteQuery(IEnumerable list) { NHInitializer.InitializeList(list, expandMap); return(list); }