internal EntityDataSourceReferenceKeyColumn(MetadataWorkspace workspace, EntityDataSourceReferenceGroup group, EdmProperty keyMember, EntityDataSourceColumn dependent) : base(CreateDisplayName(group, keyMember), dependent) { EntityDataSourceUtil.CheckArgumentNull(group, "group"); EntityDataSourceUtil.CheckArgumentNull(keyMember, "keyMember"); Debug.Assert(EntityDataSourceUtil.IsScalar(keyMember.TypeUsage.EdmType), "Expected primitive or enum type for key members."); this.group = group; this.keyMember = keyMember; this.clrType = EntityDataSourceUtil.GetMemberClrType(workspace, keyMember); // if the association end is optional (0..1), make sure the CLR type // is also nullable if (this.group.End.CorrespondingAssociationEndMember.RelationshipMultiplicity == RelationshipMultiplicity.ZeroOrOne) { this.clrType = EntityDataSourceUtil.MakeNullable(clrType); this.isNullable = true; } }
/// <summary> /// Get the Clr type for the primitive enum or complex type member. The member must not be null. /// </summary> internal static Type GetMemberClrType(MetadataWorkspace ocWorkspace, EdmMember member) { EntityDataSourceUtil.CheckArgumentNull(member, "member"); EdmType memberType = member.TypeUsage.EdmType; Debug.Assert(EntityDataSourceUtil.IsScalar(memberType) || memberType.BuiltInTypeKind == BuiltInTypeKind.ComplexType || memberType.BuiltInTypeKind == BuiltInTypeKind.EntityType, "member type must be primitive, enum, entity or complex type"); Type clrType; if (EntityDataSourceUtil.IsScalar(memberType)) { clrType = memberType.BuiltInTypeKind == BuiltInTypeKind.PrimitiveType ? ((PrimitiveType)memberType).ClrEquivalentType : GetClrType(ocWorkspace, (EnumType)memberType); if (!NullCanBeAssignedTo(clrType)) { Facet facet; if (member.TypeUsage.Facets.TryGetValue("Nullable", true, out facet)) { if ((bool)facet.Value) { clrType = MakeNullable(clrType); } } } } else { Debug.Assert( memberType.BuiltInTypeKind == BuiltInTypeKind.EntityType || memberType.BuiltInTypeKind == BuiltInTypeKind.ComplexType, "Complex or Entity type expected"); clrType = GetClrType(ocWorkspace, (StructuralType)memberType); } return(clrType); }
private static string GenerateDefaultOrderByFromTypeUsage(TypeUsage tu) { StringBuilder orderByBuilder = new StringBuilder(); ReadOnlyMetadataCollection <EdmProperty> propertyCollection; List <string> keyMemberNames = null; EntityType entityType = tu.EdmType as EntityType; if (null != entityType) { ReadOnlyMetadataCollection <EdmMember> keyMembers; keyMembers = entityType.KeyMembers; keyMemberNames = new List <string>(entityType.KeyMembers.Count); propertyCollection = entityType.Properties; foreach (EdmMember edmMember in keyMembers) { keyMemberNames.Add(edmMember.Name); } } else { return(String.Empty); } foreach (EdmProperty property in propertyCollection) { if (keyMemberNames.Contains(property.Name) && EntityDataSourceUtil.IsScalar(property.TypeUsage.EdmType)) { if (0 < orderByBuilder.Length) { orderByBuilder.Append(", "); } orderByBuilder.Append(EntityDataSourceUtil.EntitySqlElementAlias); orderByBuilder.Append("."); orderByBuilder.Append(EntityDataSourceUtil.QuoteEntitySqlIdentifier(property.Name)); } } return(orderByBuilder.ToString()); }