public void CreateTypeNameExpression_ReturnsConditionalExpression_IfTypeHasDerivedTypes() { // Arrange IEdmEntityType baseType = new EdmEntityType("NS", "BaseType"); IEdmEntityType typeA = new EdmEntityType("NS", "A", baseType); IEdmEntityType typeB = new EdmEntityType("NS", "B", baseType); IEdmEntityType typeAA = new EdmEntityType("NS", "AA", typeA); IEdmEntityType typeAAA = new EdmEntityType("NS", "AAA", typeAA); IEdmEntityType[] types = new[] { baseType, typeA, typeAAA, typeB, typeAA }; EdmModel model = new EdmModel(); foreach (var type in types) { model.AddElement(type); model.SetAnnotationValue(type, new ClrTypeAnnotation(new MockType(type.Name, @namespace: type.Namespace))); } Expression source = Expression.Constant(42); // Act Expression result = SelectExpandBinder.CreateTypeNameExpression(source, baseType, model); // Assert Assert.Equal( result.ToString(), @"IIF((42 Is AAA), ""NS.AAA"", IIF((42 Is AA), ""NS.AA"", IIF((42 Is B), ""NS.B"", IIF((42 Is A), ""NS.A"", ""NS.BaseType""))))"); }
public void Bind_GeneratedExpression_DelegateCachingEnabled() { // Arrange SelectExpandQueryOption selectExpand = new SelectExpandQueryOption("Orders", "Orders,Orders($expand=Customer)", _context); IPropertyMapper mapper = new IdentityPropertyMapper(); _model.Model.SetAnnotationValue(_model.Order, new DynamicPropertyDictionaryAnnotation(typeof(Order).GetProperty("OrderProperties"))); var oldCacheExpirationTime = _settings.SelectExpandCacheExpirationTimeSeconds; SelectExpandBinder.ResetCache(); _settings.SelectExpandCacheExpirationTimeSeconds = 10; // Act object result = SelectExpandBinder.Bind(_customer, _settings, selectExpand); // Assert Assert.Equal(SelectExpandBinder.DelegateCache.GetCount(), 1); KeyValuePair <string, object> cachedKeyValuePair = SelectExpandBinder.DelegateCache.First(); Assert.IsAssignableFrom(typeof(Delegate), cachedKeyValuePair.Value); // Cleanup _settings.SelectExpandCacheExpirationTimeSeconds = oldCacheExpirationTime; SelectExpandBinder.ResetCache(); }
public void Bind_GeneratedExpression_ContainsExpandedObject() { // Arrange SelectExpandQueryOption selectExpand = new SelectExpandQueryOption("Orders", "Orders,Orders($expand=Customer)", _context); IPropertyMapper mapper = new IdentityPropertyMapper(); _model.Model.SetAnnotationValue(_model.Order, new DynamicPropertyDictionaryAnnotation(typeof(Order).GetProperty("OrderProperties"))); // Act IQueryable queryable = SelectExpandBinder.Bind(_queryable, _settings, new DefaultAssembliesResolver(), selectExpand); // Assert IEnumerator enumerator = queryable.GetEnumerator(); Assert.True(enumerator.MoveNext()); var partialCustomer = Assert.IsAssignableFrom <SelectExpandWrapper <Customer> >(enumerator.Current); Assert.False(enumerator.MoveNext()); Assert.Null(partialCustomer.Instance); IEnumerable <SelectExpandWrapper <Order> > innerOrders = partialCustomer.Container .ToDictionary(mapper)["Orders"] as IEnumerable <SelectExpandWrapper <Order> >; Assert.NotNull(innerOrders); SelectExpandWrapper <Order> partialOrder = innerOrders.Single(); Assert.Same(_queryable.First().Orders.First(), partialOrder.Instance); object customer = partialOrder.Container.ToDictionary(mapper)["Customer"]; SelectExpandWrapper <Customer> innerInnerCustomer = Assert.IsAssignableFrom <SelectExpandWrapper <Customer> >(customer); Assert.Same(_queryable.First(), innerInnerCustomer.Instance); }
public static object Bind(object entity, ODataQuerySettings settings, SelectExpandQueryOption selectExpandQuery) { Contract.Assert(entity != null); SelectExpandBinder binder = new SelectExpandBinder(settings, selectExpandQuery); return(binder.Bind(entity)); }
public static IQueryable Bind(IQueryable queryable, ODataQuerySettings settings, SelectExpandQueryOption selectExpandQuery) { Contract.Assert(queryable != null); SelectExpandBinder binder = new SelectExpandBinder(settings, selectExpandQuery); return(binder.Bind(queryable)); }
public void CreateTypeNameExpression_ReturnsNull_IfTypeHasNoDerivedTypes() { // Arrange IEdmEntityType baseType = new EdmEntityType("NS", "BaseType"); EdmModel model = new EdmModel(); model.AddElement(baseType); Expression source = Expression.Constant(42); // Act Expression result = SelectExpandBinder.CreateTypeNameExpression(source, baseType, model); // Assert Assert.Null(result); }
public void Bind_ReturnsIEdmObject_WithRightEdmType() { // Arrange SelectExpandQueryOption selectExpand = new SelectExpandQueryOption(select: "ID", expand: null, context: _context); // Act IQueryable queryable = SelectExpandBinder.Bind(_queryable, _settings, new DefaultAssembliesResolver(), selectExpand); // Assert Assert.NotNull(queryable); IEdmTypeReference edmType = _model.Model.GetEdmTypeReference(queryable.GetType()); Assert.NotNull(edmType); Assert.True(edmType.IsCollection()); Assert.Same(_model.Customer, edmType.AsCollection().ElementType().Definition); }
public void Bind_GeneratedExpression_CheckNullObjectWithinChainProjectionByKey() { // Arrange SelectExpandQueryOption selectExpand = new SelectExpandQueryOption(null, "Orders($expand=Customer($select=City))", _context); _model.Model.SetAnnotationValue(_model.Order, new DynamicPropertyDictionaryAnnotation(typeof(Order).GetProperty("OrderProperties"))); // Act IQueryable queryable = SelectExpandBinder.Bind(_queryable, _settings, selectExpand); // Assert var unaryExpression = (UnaryExpression)((MethodCallExpression)queryable.Expression).Arguments.Single(a => a is UnaryExpression); var expressionString = unaryExpression.Operand.ToString(); Assert.Contains("IsNull = (Convert(Param_1.Customer.ID) == null)", expressionString); }
public void CreateTypeNameExpression_ThrowsODataException_IfTypeHasNoMapping() { // Arrange IEdmEntityType baseType = new EdmEntityType("NS", "BaseType"); IEdmEntityType derivedType = new EdmEntityType("NS", "DerivedType", baseType); EdmModel model = new EdmModel(); model.AddElement(baseType); model.AddElement(derivedType); Expression source = Expression.Constant(42); // Act & Assert Assert.Throws <ODataException>( () => SelectExpandBinder.CreateTypeNameExpression(source, baseType, model), "The provided mapping does not contain an entry for the entity type 'NS.DerivedType'."); }
public SelectExpandBinderTest() { _settings = new ODataQuerySettings { HandleNullPropagation = HandleNullPropagationOption.False }; _model = new CustomersModelWithInheritance(); _model.Model.SetAnnotationValue <ClrTypeAnnotation>(_model.Customer, new ClrTypeAnnotation(typeof(Customer))); _model.Model.SetAnnotationValue <ClrTypeAnnotation>(_model.SpecialCustomer, new ClrTypeAnnotation(typeof(SpecialCustomer))); _context = new ODataQueryContext(_model.Model, typeof(Customer)); _binder = new SelectExpandBinder(_settings, new DefaultAssembliesResolver(), new SelectExpandQueryOption("*", "", _context)); Customer customer = new Customer(); Order order = new Order { Customer = customer }; customer.Orders.Add(order); _queryable = new[] { customer }.AsQueryable(); }