/// <summary>
 /// Overrides the base   HandleCloudQuery so that we can support a spatial search VisitWithinRadius.
 /// </summary>
 /// <param name="node"></param>
 /// <param name="mappingState"></param>
 /// <returns></returns>
 protected override string HandleCloudQuery(QueryNode node, CloudQueryMapper.CloudQueryMapperState mappingState)
 {
     if (node.NodeType == QueryNodeType.Custom)
     {
         if (node is WithinRadiusNode)
         {
             return(this.VisitWithinRadius((WithinRadiusNode)node, mappingState));
         }
     }
     return(base.HandleCloudQuery(node, mappingState));
 }
        /// <summary>
        /// Provides a Geo Spatial Search Query linq provider.
        /// </summary>
        /// <param name="radiusNode"></param>
        /// <param name="state"></param>
        /// <returns></returns>
        protected virtual string VisitWithinRadius(WithinRadiusNode radiusNode, CloudQueryMapper.CloudQueryMapperState state)
        {
            var orderBy = string.Empty;

            if ((bool)radiusNode.DistanceSort)
            {
                orderBy = $"&$orderby=geo.distance({radiusNode.FieldName}, geography'POINT({radiusNode.Longitude} {radiusNode.Latitude})') asc";
            }

            var queryText = $"&search=*&$top={radiusNode.MaxResults}&$filter=geo.distance({radiusNode.FieldName}, geography'POINT({radiusNode.Longitude} {radiusNode.Latitude})') le {radiusNode.Radius}{orderBy}";

            return(queryText);
        }