Пример #1
0
        /// <summary>
        /// Converts a normalized binary expression into the appropriate ParseQuery clause.
        /// </summary>
        private static ParseQuery <T> WhereBinaryExpression <T>(
            this ParseQuery <T> source, Expression <Func <T, bool> > expression, BinaryExpression node)
            where T : ParseObject
        {
            var leftTransformed = new ObjectNormalizer().Visit(node.Left) as MethodCallExpression;

            if (!(IsParseObjectGet(leftTransformed) &&
                  leftTransformed.Object == expression.Parameters[0]))
            {
                throw new InvalidOperationException(
                          "Where expressions must have one side be a field operation on a ParseObject.");
            }

            var fieldPath   = GetValue(leftTransformed.Arguments[0]) as string;
            var filterValue = GetValue(node.Right);

            if (filterValue != null && !ParseEncoder.IsValidType(filterValue))
            {
                throw new InvalidOperationException(
                          "Where clauses must use types compatible with ParseObjects.");
            }

            switch (node.NodeType)
            {
            case ExpressionType.GreaterThan:
                return(source.WhereGreaterThan(fieldPath, filterValue));

            case ExpressionType.GreaterThanOrEqual:
                return(source.WhereGreaterThanOrEqualTo(fieldPath, filterValue));

            case ExpressionType.LessThan:
                return(source.WhereLessThan(fieldPath, filterValue));

            case ExpressionType.LessThanOrEqual:
                return(source.WhereLessThanOrEqualTo(fieldPath, filterValue));

            case ExpressionType.Equal:
                return(source.WhereEqualTo(fieldPath, filterValue));

            case ExpressionType.NotEqual:
                return(source.WhereNotEqualTo(fieldPath, filterValue));

            default:
                throw new InvalidOperationException(
                          "Where expressions do not support this operator.");
            }
        }
Пример #2
0
        public async Task<IList<Site>> GetSites(string searchText, double latitude = 0, double longitude = 0)
        {
            var sitesQuery = new ParseQuery<ApParseSite>()
                .OrderByDescending(x => x.UseCount)
                .Limit(100);

            if (!string.IsNullOrEmpty(searchText))
            {
                var lowerSearchText = searchText.ToLower();
                sitesQuery = sitesQuery.Where(s => s.Search.Contains(lowerSearchText));
            }
            else
            {
                sitesQuery = sitesQuery.WhereGreaterThan("UseCount", 1000);
            }

            var allSites = (await sitesQuery.FindAsync())
                .Select(s => ConvertToSite(s, new ParseGeoPoint(latitude, longitude)));

            // Remove duplicates
            var siteIds = new HashSet<long>();
            var sites = new List<Site>();
            foreach (var site in allSites)
            {
                if (site.SiteId.HasValue)
                {
                    if (!siteIds.Contains(site.SiteId.Value))
                    {
                        siteIds.Add(site.SiteId.Value);
                        sites.Add(site);
                    }
                }
            }

            return sites
                .OrderByDescending(s => s.DistanceKm)
                .ThenBy(s => s.UseCount)
                .ToList();
        }