/// <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 (leftTransformed != null && !(IsParseObjectGet(leftTransformed) && leftTransformed.Object == expression.Parameters[0])) { throw new InvalidOperationException( "Where expressions must have one side be a field operation on a ParseObject."); } if (leftTransformed != null) { 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."); } } return(null); }
public void TestIsValidType() { Assert.IsTrue(ParseEncoder.IsValidType(322)); Assert.IsTrue(ParseEncoder.IsValidType(0.3f)); Assert.IsTrue(ParseEncoder.IsValidType(new byte[] { 1, 2, 3, 4 })); Assert.IsTrue(ParseEncoder.IsValidType("corgi")); Assert.IsTrue(ParseEncoder.IsValidType(new ParseObject("Corgi"))); Assert.IsTrue(ParseEncoder.IsValidType(new ParseACL())); Assert.IsTrue(ParseEncoder.IsValidType(new ParseFile("Corgi", new byte[0]))); Assert.IsTrue(ParseEncoder.IsValidType(new ParseGeoPoint(1, 2))); Assert.IsTrue(ParseEncoder.IsValidType(new ParseRelation <ParseObject>(new ParseObject("Corgi"), "corgi"))); Assert.IsTrue(ParseEncoder.IsValidType(new DateTime())); Assert.IsTrue(ParseEncoder.IsValidType(new List <object>())); Assert.IsTrue(ParseEncoder.IsValidType(new Dictionary <string, string>())); Assert.IsTrue(ParseEncoder.IsValidType(new Dictionary <string, object>())); Assert.IsFalse(ParseEncoder.IsValidType(new ParseAddOperation(new List <object>()))); Assert.IsFalse(ParseEncoder.IsValidType(Task <ParseObject> .FromResult(new ParseObject("Corgi")))); Assert.Throws <MissingMethodException>(() => ParseEncoder.IsValidType(new Dictionary <object, object>())); Assert.Throws <MissingMethodException>(() => ParseEncoder.IsValidType(new Dictionary <object, string>())); }