private SearchResults <TDocument> ExecuteGetResults <TDocument>(AzureQuery query, AzureSearchResults <TDocument> processedResults, DocumentSearchResult results)
        {
            var searchHits = processedResults.GetSearchHits();

            Sitecore.ContentSearch.Linq.FacetResults facets = null;
            if (query.FacetQueries != null && query.FacetQueries.Count > 0)
            {
                facets = ExecuteGetFacets(query);
            }
            return(new SearchResults <TDocument>(searchHits, (int)results.Count, facets));
        }
        private TResult ApplyScalarMethods <TResult, TDocument>(AzureQuery query, AzureSearchResults <TDocument> processedResults, DocumentSearchResult results)
        {
            var    queryMethod = query.Methods.FirstOrDefault();
            object obj;

            switch (queryMethod.MethodType)
            {
            case QueryMethodType.All:
                obj = true;
                //Check for CustomMethod
                var customMethod = queryMethod as CustomMethod;
                if (customMethod != null)
                {
                    switch (customMethod.CustomMethodType)
                    {
                    case Linq.Nodes.CustomQueryMethodTypes.GetHightlights:
                        obj = ExecuteGetHighlightResults(query);
                        break;
                    }
                }
                break;

            case QueryMethodType.Any:
                obj = (processedResults.Any() ? 1 : 0);
                break;

            case QueryMethodType.Count:
                obj = query.Methods.Any(m =>
                {
                    if (m.MethodType != QueryMethodType.Skip)
                    {
                        return(m.MethodType == QueryMethodType.Take);
                    }
                    return(true);
                }) ? processedResults.Count() : results.Count;
                break;

            case QueryMethodType.ElementAt:
                obj = !((ElementAtMethod)queryMethod).AllowDefaultValue ? processedResults.ElementAt(((ElementAtMethod)queryMethod).Index) : processedResults.ElementAtOrDefault(((ElementAtMethod)queryMethod).Index);
                break;

            case QueryMethodType.First:
                obj = !((FirstMethod)queryMethod).AllowDefaultValue ? processedResults.First() : processedResults.FirstOrDefault();
                break;

            case QueryMethodType.Last:
                obj = !((LastMethod)queryMethod).AllowDefaultValue ? processedResults.Last() : processedResults.LastOrDefault();
                break;

            case QueryMethodType.Single:
                obj = !((SingleMethod)queryMethod).AllowDefaultValue ? processedResults.Single() : processedResults.SingleOrDefault();
                break;

            case QueryMethodType.GetResults:
                obj = ExecuteGetResults <TDocument>(query, processedResults, results);
                break;

            case QueryMethodType.GetFacets:
                obj = ExecuteGetFacets(query);
                break;

            default:
                throw new InvalidOperationException("Invalid query method: " + queryMethod.MethodType);
            }
            return((TResult)Convert.ChangeType(obj, typeof(TResult)));
        }