コード例 #1
0
        /// <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);
        }
コード例 #2
0
ファイル: NHQueryHelper.cs プロジェクト: jeffweng/Breeze
 /// <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);
 }