public void CanCreateActionWithComplexReturnType() { // Arrange // Act ODataModelBuilder builder = new ODataModelBuilder(); ActionConfiguration createAddress = builder.Action("CreateAddress").Returns <Address>(); ActionConfiguration createAddresses = builder.Action("CreateAddresses").ReturnsCollection <Address>(); // Assert ComplexTypeConfiguration address = createAddress.ReturnType as ComplexTypeConfiguration; Assert.NotNull(address); Assert.Equal(typeof(Address).FullName, address.FullName); Assert.Null(createAddress.EntitySet); CollectionTypeConfiguration addresses = createAddresses.ReturnType as CollectionTypeConfiguration; Assert.NotNull(addresses); Assert.Equal(string.Format("Collection({0})", typeof(Address).FullName), addresses.FullName); address = addresses.ElementType as ComplexTypeConfiguration; Assert.NotNull(address); Assert.Equal(typeof(Address).FullName, address.FullName); Assert.Null(createAddresses.EntitySet); }
public void CanCreateActionWithEntityReturnType() { // Arrange // Act ODataModelBuilder builder = new ODataModelBuilder(); ActionConfiguration createGoodCustomer = builder.Action("CreateGoodCustomer").ReturnsFromEntitySet <Customer>("GoodCustomers"); ActionConfiguration createBadCustomers = builder.Action("CreateBadCustomers").ReturnsCollectionFromEntitySet <Customer>("BadCustomers"); // Assert EntityTypeConfiguration customer = createGoodCustomer.ReturnType as EntityTypeConfiguration; Assert.NotNull(customer); Assert.Equal(typeof(Customer).FullName, customer.FullName); EntitySetConfiguration goodCustomers = builder.EntitySets.SingleOrDefault(s => s.Name == "GoodCustomers"); Assert.NotNull(goodCustomers); Assert.Same(createGoodCustomer.EntitySet, goodCustomers); CollectionTypeConfiguration customers = createBadCustomers.ReturnType as CollectionTypeConfiguration; Assert.NotNull(customers); customer = customers.ElementType as EntityTypeConfiguration; Assert.NotNull(customer); EntitySetConfiguration badCustomers = builder.EntitySets.SingleOrDefault(s => s.Name == "BadCustomers"); Assert.NotNull(badCustomers); Assert.Same(createBadCustomers.EntitySet, badCustomers); }
public ActionConfiguration ReturnsCollectionFromEntitySet <TElementEntityType>(string entitySetName) where TElementEntityType : class { Type clrCollectionType = typeof(IEnumerable <TElementEntityType>); ModelBuilder.EntitySet <TElementEntityType>(entitySetName); EntitySet = ModelBuilder.EntitySets.Single(s => s.Name == entitySetName); IEdmTypeConfiguration elementType = ModelBuilder.GetTypeConfigurationOrNull(typeof(TElementEntityType)); ReturnType = new CollectionTypeConfiguration(elementType, clrCollectionType); return(this); }
public ParameterConfiguration CollectionParameter <TElementType>(string name) { Type elementType = typeof(TElementType); IEdmTypeConfiguration elementTypeConfiguration = ModelBuilder.GetTypeConfigurationOrNull(elementType); if (elementTypeConfiguration == null) { ModelBuilder.AddComplexType(elementType); elementTypeConfiguration = ModelBuilder.GetTypeConfigurationOrNull(elementType); } CollectionTypeConfiguration parameterType = new CollectionTypeConfiguration(elementTypeConfiguration, typeof(IEnumerable <>).MakeGenericType(elementType)); return(AddParameter(name, parameterType)); }
public ActionConfiguration ReturnsCollectionFromEntitySet <TElementEntityType>( EntitySetConfiguration <TElementEntityType> entitySetConfiguration) where TElementEntityType : class { if (entitySetConfiguration == null) { throw Error.ArgumentNull("entitySetConfiguration"); } Type clrCollectionType = typeof(IEnumerable <TElementEntityType>); EntitySet = entitySetConfiguration.EntitySet; IEdmTypeConfiguration elementType = ModelBuilder.GetTypeConfigurationOrNull(typeof(TElementEntityType)); ReturnType = new CollectionTypeConfiguration(elementType, clrCollectionType); return(this); }
public ActionConfiguration ReturnsCollection <TReturnElementType>() { // TODO: I don't like this temporary solution that says the CLR type of the collection is IEnumerable<T>. // It basically has no meaning. That said the CLR type is meaningful for IEdmTypeConfiguration // because I still think it is useful for IEdmPrimitiveTypes too. // You can imagine the override of this that takes a delegate using the correct CLR type for the return type. Type clrCollectionType = typeof(IEnumerable <TReturnElementType>); Type clrElementType = typeof(TReturnElementType); IEdmTypeConfiguration edmElementType = ModelBuilder.GetTypeConfigurationOrNull(clrElementType); if (edmElementType == null) { ModelBuilder.AddComplexType(clrElementType); edmElementType = ModelBuilder.GetTypeConfigurationOrNull(clrElementType); } ReturnType = new CollectionTypeConfiguration(edmElementType, clrCollectionType); return(this); }
private static IEdmTypeReference GetEdmTypeReference(Dictionary <Type, IEdmStructuredType> availableTypes, IEdmTypeConfiguration configuration, bool nullable) { Contract.Assert(availableTypes != null); if (configuration == null) { return(null); } EdmTypeKind kind = configuration.Kind; if (kind == EdmTypeKind.Collection) { CollectionTypeConfiguration collectionType = configuration as CollectionTypeConfiguration; EdmCollectionType edmCollectionType = new EdmCollectionType(GetEdmTypeReference(availableTypes, collectionType.ElementType, false)); return(new EdmCollectionTypeReference(edmCollectionType, nullable)); } else if (availableTypes.ContainsKey(configuration.ClrType)) { IEdmStructuredType structuralType = availableTypes[configuration.ClrType]; if (kind == EdmTypeKind.Complex) { return(new EdmComplexTypeReference(structuralType as IEdmComplexType, nullable)); } else if (kind == EdmTypeKind.Entity) { return(new EdmEntityTypeReference(structuralType as IEdmEntityType, nullable)); } else { throw Error.InvalidOperation(SRResources.UnsupportedEdmTypeKind, kind.ToString()); } } else if (configuration.Kind == EdmTypeKind.Primitive) { PrimitiveTypeConfiguration primitiveTypeConfiguration = configuration as PrimitiveTypeConfiguration; return(new EdmPrimitiveTypeReference(primitiveTypeConfiguration.EdmPrimitiveType, nullable)); } else { throw Error.InvalidOperation(SRResources.NoMatchingIEdmTypeFound, configuration.FullName); } }