public override TResult Execute <TResult>(AzureQuery query)
        {
            if (EnumerableLinq.ShouldExecuteEnumerableLinqQuery(query))
            {
                return(EnumerableLinq.ExecuteEnumerableLinqQuery <TResult>(query));
            }
            if (!DoExecuteSearch(query))
            {
                return(ExecuteScalarMethod <TResult>(query));
            }
            if (typeof(TResult).IsGenericType && typeof(TResult).GetGenericTypeDefinition() == typeof(SearchResults <>))
            {
                var topDocs     = ExecuteQueryAgainstAzure(query);
                var type        = typeof(TResult).GetGenericArguments()[0];
                var methodInfo1 = GetType().GetMethod("ApplySearchMethods", BindingFlags.Instance | BindingFlags.NonPublic).MakeGenericMethod(type);
                var methodInfo2 = GetType().GetMethod("ApplyScalarMethods", BindingFlags.Instance | BindingFlags.NonPublic).MakeGenericMethod(typeof(TResult), type);
                var obj         = methodInfo1.Invoke(this, new object[2]
                {
                    query,
                    topDocs
                });
                return((TResult)methodInfo2.Invoke(this, new object[3]
                {
                    query,
                    obj,
                    topDocs
                }));
            }
            var topDocs1         = ExecuteQueryAgainstAzure(query);
            var processedResults = ApplySearchMethods <TResult>(query, topDocs1);

            return(ApplyScalarMethods <TResult, TResult>(query, processedResults, topDocs1));
        }
        public override IEnumerable <TElement> FindElements <TElement>(AzureQuery query)
        {
            if (EnumerableLinq.ShouldExecuteEnumerableLinqQuery(query))
            {
                return(EnumerableLinq.ExecuteEnumerableLinqQuery <IEnumerable <TElement> >(query));
            }
            var searchHits = ExecuteQueryAgainstAzure(query);

            return(ApplySearchMethods <TElement>(query, searchHits).GetSearchResults());
        }
        public override TResult Execute <TResult>(SolrCompositeQuery compositeQuery)
        {
            if (EnumerableLinq.ShouldExecuteEnumerableLinqQuery(compositeQuery))
            {
                return(EnumerableLinq.ExecuteEnumerableLinqQuery <TResult>(compositeQuery));
            }
            if (typeof(TResult).IsGenericType &&
                typeof(TResult).GetGenericTypeDefinition() == typeof(SearchResults <>))
            {
                var resultType       = typeof(TResult).GetGenericArguments()[0];
                var solrQueryResults = this.Execute(compositeQuery, resultType);
                var type             = typeof(SolrSearchResults <>).MakeGenericType(resultType);
                var methodInfo       = this.GetType()
                                       .GetMethod("ApplyScalarMethods", BindingFlags.Instance | BindingFlags.NonPublic)
                                       .MakeGenericMethod(typeof(TResult), resultType);
                var selectMethod = GetSelectMethod(compositeQuery);

                var instance = ReflectionUtility.CreateInstance(type, (object)this._context, (object)solrQueryResults,
                                                                (object)selectMethod, (object)compositeQuery.ExecutionContexts,
                                                                (object)compositeQuery.VirtualFieldProcessors);
                return((TResult)methodInfo.Invoke(this, new object[3]
                {
                    compositeQuery,
                    instance,
                    solrQueryResults
                }));
            }

            compositeQuery.Methods.Add(new GetFacetsMethod());

            var solrQueryResults1 = this.Execute(compositeQuery, typeof(TResult));
            var selectMethod1     = GetSelectMethod(compositeQuery);
            var processedResults  = new SolrSearchResults <TResult>(this._context, solrQueryResults1, selectMethod1, compositeQuery.ExecutionContexts, compositeQuery.VirtualFieldProcessors);

            return(this.ApplyScalarMethods <TResult, TResult>(compositeQuery, processedResults, solrQueryResults1));
        }