/// <summary> /// Try and get the mapped type for the given primitiveTypeKind in the given dataspace /// </summary> /// <param name="primitiveTypeKind"> The primitive type kind of the primitive type to retrieve </param> /// <param name="facets"> The facets to use in picking the primitive type </param> /// <param name="type"> The resulting type </param> /// <returns> Whether a type was retrieved or not </returns> internal bool TryGetType(PrimitiveTypeKind primitiveTypeKind, IEnumerable <Facet> facets, out PrimitiveType type) { type = null; // Now, see if we have any types for this model type, if so, loop through to find the best matching one var primitiveTypes = EntityUtil.CheckArgumentOutOfRange(_primitiveTypeMap, (int)primitiveTypeKind, "primitiveTypeKind"); if ((null != primitiveTypes) && (0 < primitiveTypes.Count)) { if (primitiveTypes.Count == 1) { type = primitiveTypes[0]; return(true); } if (facets == null) { var facetDescriptions = EdmProviderManifest.GetInitialFacetDescriptions(primitiveTypeKind); if (facetDescriptions == null) { type = primitiveTypes[0]; return(true); } Debug.Assert(facetDescriptions.Length > 0); facets = CreateInitialFacets(facetDescriptions); } Debug.Assert(type == null, "type must be null here"); var isMaxLengthSentinel = false; // Create a dictionary of facets for easy lookup foreach (var facet in facets) { if ((primitiveTypeKind == PrimitiveTypeKind.String || primitiveTypeKind == PrimitiveTypeKind.Binary) && facet.Value != null && facet.Name == DbProviderManifest.MaxLengthFacetName && Helper.IsUnboundedFacetValue(facet)) { // MaxLength has the sentinel value. So this facet need not be added. isMaxLengthSentinel = true; continue; } } var maxLength = 0; // Find a primitive type with the matching constraint foreach (var primitiveType in primitiveTypes) { if (isMaxLengthSentinel) { if (type == null) { type = primitiveType; maxLength = Helper.GetFacet(primitiveType.FacetDescriptions, DbProviderManifest.MaxLengthFacetName).MaxValue.Value; } else { var newMaxLength = Helper.GetFacet(primitiveType.FacetDescriptions, DbProviderManifest.MaxLengthFacetName).MaxValue.Value; if (newMaxLength > maxLength) { type = primitiveType; maxLength = newMaxLength; } } } else { type = primitiveType; break; } } Debug.Assert(type != null); return(true); } return(false); }