/// <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."); } }
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(); }