/// <inheritdoc /> public override object Read(ODataMessageReader messageReader, Type type, ODataDeserializerContext readContext) { if (messageReader == null) { throw Error.ArgumentNull("messageReader"); } IEdmTypeReference edmType = readContext.GetEdmType(type); Contract.Assert(edmType != null); if (!edmType.IsCollection()) { throw Error.Argument("type", SRResources.ArgumentMustBeOfType, EdmTypeKind.Collection); } IEdmCollectionTypeReference collectionType = edmType.AsCollection(); IEdmTypeReference elementType = collectionType.ElementType(); IEnumerable result = ReadInline(ReadCollection(messageReader, elementType), edmType, readContext) as IEnumerable; if (result != null && readContext.IsUntyped && elementType.IsComplex()) { EdmComplexObjectCollection complexCollection = new EdmComplexObjectCollection(collectionType); foreach (EdmComplexObject complexObject in result) { complexCollection.Add(complexObject); } return complexCollection; } return result; }
public void GetEdmType_Returns_EdmTypeInitializedByCtor() { IEdmTypeReference elementType = new EdmComplexTypeReference(new EdmComplexType("NS", "Complex"), isNullable: false); IEdmCollectionTypeReference collectionType = new EdmCollectionTypeReference(new EdmCollectionType(elementType), isNullable: false); var edmObject = new EdmComplexObjectCollection(collectionType); Assert.Same(collectionType, edmObject.GetEdmType()); }
public static bool TryCreateInstance(Type collectionType, IEdmCollectionTypeReference edmCollectionType, Type elementType, out IEnumerable instance) { Contract.Assert(collectionType != null); if (collectionType == typeof(EdmComplexObjectCollection)) { instance = new EdmComplexObjectCollection(edmCollectionType); return true; } else if (collectionType == typeof(EdmEntityObjectCollection)) { instance = new EdmEntityObjectCollection(edmCollectionType); return true; } else if (collectionType.IsGenericType) { Type genericDefinition = collectionType.GetGenericTypeDefinition(); if (genericDefinition == typeof(IEnumerable<>) || genericDefinition == typeof(ICollection<>) || genericDefinition == typeof(IList<>)) { instance = Activator.CreateInstance(typeof(List<>).MakeGenericType(elementType)) as IEnumerable; return true; } } if (collectionType.IsArray) { // We dont know the size of the collection in advance. So, create a list and later call ToArray. instance = Activator.CreateInstance(typeof(List<>).MakeGenericType(elementType)) as IEnumerable; return true; } if (collectionType.GetConstructor(Type.EmptyTypes) != null && !collectionType.IsAbstract) { instance = Activator.CreateInstance(collectionType) as IEnumerable; return true; } instance = null; return false; }
/// <inheritdoc /> public override object Read(ODataMessageReader messageReader, ODataDeserializerContext readContext) { if (messageReader == null) { throw Error.ArgumentNull("messageReader"); } IEnumerable result = ReadInline(ReadCollection(messageReader), readContext) as IEnumerable; if (result != null && readContext.IsUntyped && ElementType.IsComplex()) { EdmComplexObjectCollection complexCollection = new EdmComplexObjectCollection(CollectionType); foreach (EdmComplexObject complexObject in result) { complexCollection.Add(complexObject); } return complexCollection; } return result; }
public ITestActionResult Get() { IEdmEntityType customerType = Request.GetModel().FindDeclaredType("Microsoft.Test.E2E.AspNet.OData.TestCustomer") as IEdmEntityType; IEdmEntityType customerWithAddressType = Request.GetModel().FindDeclaredType("Microsoft.Test.E2E.AspNet.OData.TestCustomerWithAddress") as IEdmEntityType; IEdmComplexType addressType = Request.GetModel().FindDeclaredType("Microsoft.Test.E2E.AspNet.OData.TestAddress") as IEdmComplexType; IEdmEntityType orderType = Request.GetModel().FindDeclaredType("Microsoft.Test.E2E.AspNet.OData.TestOrder") as IEdmEntityType; IEdmEntitySet ordersSet = Request.GetModel().FindDeclaredEntitySet("TestOrders") as IEdmEntitySet; EdmChangedObjectCollection changedObjects = new EdmChangedObjectCollection(customerType); EdmDeltaComplexObject a = new EdmDeltaComplexObject(addressType); a.TrySetPropertyValue("State", "State"); a.TrySetPropertyValue("ZipCode", null); EdmDeltaEntityObject changedEntity = new EdmDeltaEntityObject(customerWithAddressType); changedEntity.TrySetPropertyValue("Id", 1); changedEntity.TrySetPropertyValue("Name", "Name"); changedEntity.TrySetPropertyValue("Address", a); changedEntity.TrySetPropertyValue("PhoneNumbers", new List <String> { "123-4567", "765-4321" }); changedEntity.TrySetPropertyValue("OpenProperty", 10); changedEntity.TrySetPropertyValue("NullOpenProperty", null); changedObjects.Add(changedEntity); EdmComplexObjectCollection places = new EdmComplexObjectCollection(new EdmCollectionTypeReference(new EdmCollectionType(new EdmComplexTypeReference(addressType, true)))); EdmDeltaComplexObject b = new EdmDeltaComplexObject(addressType); b.TrySetPropertyValue("City", "City2"); b.TrySetPropertyValue("State", "State2"); b.TrySetPropertyValue("ZipCode", 12345); b.TrySetPropertyValue("OpenProperty", 10); b.TrySetPropertyValue("NullOpenProperty", null); places.Add(a); places.Add(b); var newCustomer = new EdmDeltaEntityObject(customerType); newCustomer.TrySetPropertyValue("Id", 10); newCustomer.TrySetPropertyValue("Name", "NewCustomer"); newCustomer.TrySetPropertyValue("FavoritePlaces", places); changedObjects.Add(newCustomer); var newOrder = new EdmDeltaEntityObject(orderType); newOrder.NavigationSource = ordersSet; newOrder.TrySetPropertyValue("Id", 27); newOrder.TrySetPropertyValue("Amount", 100); changedObjects.Add(newOrder); var deletedCustomer = new EdmDeltaDeletedEntityObject(customerType); deletedCustomer.Id = "7"; deletedCustomer.Reason = DeltaDeletedEntryReason.Changed; changedObjects.Add(deletedCustomer); var deletedOrder = new EdmDeltaDeletedEntityObject(orderType); deletedOrder.NavigationSource = ordersSet; deletedOrder.Id = "12"; deletedOrder.Reason = DeltaDeletedEntryReason.Deleted; changedObjects.Add(deletedOrder); var deletedLink = new EdmDeltaDeletedLink(customerType); deletedLink.Source = new Uri("http://localhost/odata/DeltaCustomers(1)"); deletedLink.Target = new Uri("http://localhost/odata/DeltaOrders(12)"); deletedLink.Relationship = "Orders"; changedObjects.Add(deletedLink); var addedLink = new EdmDeltaLink(customerType); addedLink.Source = new Uri("http://localhost/odata/DeltaCustomers(10)"); addedLink.Target = new Uri("http://localhost/odata/DeltaOrders(27)"); addedLink.Relationship = "Orders"; changedObjects.Add(addedLink); return(Ok(changedObjects)); }
IEdmObject InvokeTVF(IEdmFunction func, JObject parameterValues, ODataQueryOptions queryOptions = null) { IEdmType edmType = func.ReturnType.Definition; IEdmType elementType = (edmType as IEdmCollectionType).ElementType.Definition; EdmComplexObjectCollection collection = new EdmComplexObjectCollection(new EdmCollectionTypeReference(edmType as IEdmCollectionType)); var target = BuildTVFTarget(func, parameterValues); var cmd = BuildSqlQueryCmd(queryOptions, target); using (DbAccess db = new DbAccess(this.ConnectionString)) { db.ExecuteReader(cmd, (reader) => { EdmComplexObject entity = new EdmComplexObject(elementType as IEdmComplexType); for (int i = 0; i < reader.FieldCount; i++) { reader.SetEntityPropertyValue(i, entity); } collection.Add(entity); }, null, CommandType.Text); } return collection; }
IEdmObject InvokeFuncCollection(IEdmFunction func, JObject parameterValues, ODataQueryOptions queryOptions = null) { IEdmType edmType = func.ReturnType.Definition; IEdmType elementType = (edmType as IEdmCollectionType).ElementType.Definition; EdmComplexObjectCollection collection = new EdmComplexObjectCollection(new EdmCollectionTypeReference(edmType as IEdmCollectionType)); using (DbAccess db = new DbAccess(this.ConnectionString)) { db.ExecuteReader(func.Name, (reader) => { EdmComplexObject entity = new EdmComplexObject(elementType as IEdmComplexType); for (int i = 0; i < reader.FieldCount; i++) { reader.SetEntityPropertyValue(i, entity); } collection.Add(entity); }, (pars) => { SetParameter(func, parameterValues, edmType, pars); }); } return collection; }
/// <inheritdoc /> public sealed override object ReadInline(object item, IEdmTypeReference edmType, ODataDeserializerContext readContext) { if (item == null) { return(null); } if (edmType == null) { throw Error.ArgumentNull(nameof(edmType)); } if (readContext == null) { throw Error.ArgumentNull(nameof(readContext)); } if (!edmType.IsCollection() || !edmType.AsCollection().ElementType().IsStructured()) { throw Error.Argument(nameof(edmType), SRResources.TypeMustBeResourceSet, edmType.ToTraceString()); } ODataResourceSetWrapper resourceSet = item as ODataResourceSetWrapper; if (resourceSet == null) { throw Error.Argument(nameof(item), SRResources.ArgumentMustBeOfType, typeof(ODataResourceSetWrapper).Name); } // Recursion guard to avoid stack overflows RuntimeHelpers.EnsureSufficientExecutionStack(); IEdmStructuredTypeReference elementType = edmType.AsCollection().ElementType().AsStructured(); IEnumerable result = ReadResourceSet(resourceSet, elementType, readContext); if (result != null && elementType.IsComplex()) { if (readContext.IsUntyped) { EdmComplexObjectCollection complexCollection = new EdmComplexObjectCollection(edmType.AsCollection()); foreach (EdmComplexObject complexObject in result) { complexCollection.Add(complexObject); } return(complexCollection); } else { Type elementClrType = readContext.Model.GetClrType(elementType); IEnumerable castedResult = CastMethodInfo.MakeGenericMethod(elementClrType).Invoke(null, new object[] { result }) as IEnumerable; return(castedResult); } } else { return(result); } }
private dynamic CreateAddresses(int i) { EdmComplexObject[] addresses = new EdmComplexObject[i]; for (int j = 0; j < i; j++) { dynamic complexObject = CreateAddress(j); addresses[j] = complexObject; } var collection = new EdmComplexObjectCollection(new EdmCollectionTypeReference(new EdmCollectionType(new EdmComplexTypeReference(AddressType, false))), addresses); return collection; }
/// <inheritdoc /> public sealed override object ReadInline(object item, IEdmTypeReference edmType, ODataDeserializerContext readContext) { if (item == null) { return null; } if (edmType == null) { throw Error.ArgumentNull("edmType"); } if (!edmType.IsCollection()) { throw new SerializationException( Error.Format(SRResources.TypeCannotBeDeserialized, edmType.ToTraceString(), typeof(ODataMediaTypeFormatter))); } IEdmCollectionTypeReference collectionType = edmType.AsCollection(); IEdmTypeReference elementType = collectionType.ElementType(); ODataCollectionValue collection = item as ODataCollectionValue; if (collection == null) { throw Error.Argument("item", SRResources.ArgumentMustBeOfType, typeof(ODataCollectionValue).Name); } // Recursion guard to avoid stack overflows RuntimeHelpers.EnsureSufficientExecutionStack(); IEnumerable result = ReadCollectionValue(collection, elementType, readContext); if (result != null) { if (readContext.IsUntyped && elementType.IsComplex()) { EdmComplexObjectCollection complexCollection = new EdmComplexObjectCollection(collectionType); foreach (EdmComplexObject complexObject in result) { complexCollection.Add(complexObject); } return complexCollection; } else if (readContext.IsUntyped && elementType.IsEnum()) { EdmEnumObjectCollection enumCollection = new EdmEnumObjectCollection(collectionType); foreach (EdmEnumObject enumObject in result) { enumCollection.Add(enumObject); } return enumCollection; } else { Type elementClrType = EdmLibHelpers.GetClrType(elementType, readContext.Model); IEnumerable castedResult = _castMethodInfo.MakeGenericMethod(elementClrType).Invoke(null, new object[] { result }) as IEnumerable; return castedResult; } } return null; }
public bool ComplexCollectionFunctionOnAttribute(int key, [FromODataUri] EdmComplexObjectCollection addresses) { return(ComplexCollectionFunction(key, addresses)); }
private static EdmEntityObjectCollection GetCustomers() { if (_untypedSimpleOpenCustormers != null) { return _untypedSimpleOpenCustormers; } EdmEntityType customerType = new EdmEntityType("NS", "UntypedSimpleOpenCustomer", null, false, true); customerType.AddKeys(customerType.AddStructuralProperty("CustomerId", EdmPrimitiveTypeKind.Int32)); EdmEntityObject customer = new EdmEntityObject(customerType); customer.TrySetPropertyValue("CustomerId", 1); //Add Numbers primitive collection property customer.TrySetPropertyValue("DeclaredNumbers", new[] { 1, 2 }); //Add Color, Colors enum(collection) property EdmEnumType colorType = new EdmEnumType("NS", "Color"); colorType.AddMember(new EdmEnumMember(colorType, "Red", new EdmIntegerConstant(0))); EdmEnumObject color = new EdmEnumObject(colorType, "Red"); EdmEnumObject color2 = new EdmEnumObject(colorType, "0"); EdmEnumObject color3 = new EdmEnumObject(colorType, "Red"); customer.TrySetPropertyValue("Color", color); List<IEdmEnumObject> colorList = new List<IEdmEnumObject>(); colorList.Add(color); colorList.Add(color2); colorList.Add(color3); IEdmCollectionTypeReference enumCollectionType = new EdmCollectionTypeReference(new EdmCollectionType(colorType.ToEdmTypeReference(false))); EdmEnumObjectCollection colors = new EdmEnumObjectCollection(enumCollectionType, colorList); customer.TrySetPropertyValue("Colors", colors); customer.TrySetPropertyValue("DeclaredColors", colors); //Add Addresses complex(collection) property EdmComplexType addressType = new EdmComplexType("NS", "Address", null, false, true); addressType.AddStructuralProperty("Street", EdmPrimitiveTypeKind.String); EdmComplexObject address = new EdmComplexObject(addressType); address.TrySetPropertyValue("Street", "No1"); EdmComplexObject address2 = new EdmComplexObject(addressType); address2.TrySetPropertyValue("Street", "No2"); List<IEdmComplexObject> addressList = new List<IEdmComplexObject>(); addressList.Add(address); addressList.Add(address2); IEdmCollectionTypeReference complexCollectionType = new EdmCollectionTypeReference(new EdmCollectionType(addressType.ToEdmTypeReference(false))); EdmComplexObjectCollection addresses = new EdmComplexObjectCollection(complexCollectionType, addressList); customer.TrySetPropertyValue("DeclaredAddresses", addresses); EdmEntityObjectCollection customers = new EdmEntityObjectCollection(new EdmCollectionTypeReference(new EdmCollectionType(customerType.ToEdmTypeReference(false)))); customers.Add(customer); _untypedSimpleOpenCustormers = customers; return _untypedSimpleOpenCustormers; }
public IHttpActionResult ComplexFunction(int key, [FromODataUri] EdmComplexObject address, [FromODataUri] EdmComplexObjectCollection addressList) { return(null); }
public static IODataComplexObjectCollection ToODataComplexObjectCollection(this EdmComplexObjectCollection edmComplexObjectCollection) { return(new EdmComplexObjectCollectionWrapper(edmComplexObjectCollection)); }