public CollectionObjectModel GetCollectionMember(MemberInfo memberInfo) { memberInfo = memberInfo.AsReflectedMemberOf(this.ObjectType); CollectionObjectModel ret = this.CollectionMembers.FindValue(memberInfo); return(ret); }
public virtual void AddCollectionMember(MemberInfo p, CollectionObjectModel model) { throw new NotSupportedException(); }
public void Include(NavigationNode navigationNode, QueryModel queryModel, bool handleCollection) { TypeDescriptor descriptor = EntityTypeContainer.GetDescriptor(this.ObjectType); PropertyDescriptor navigationDescriptor = descriptor.GetPropertyDescriptor(navigationNode.Property); if (navigationDescriptor.Definition.Kind == TypeKind.Primitive) { throw new NotSupportedException($"'{navigationNode.Property.Name}' is not navigation property."); } ComplexObjectModel objectModel = null; if (navigationDescriptor.Definition.Kind == TypeKind.Complex) { objectModel = this.GetComplexMember(navigationNode.Property); if (objectModel == null) { objectModel = this.GenComplexObjectModel(navigationDescriptor as ComplexPropertyDescriptor, navigationNode, queryModel); this.AddComplexMember(navigationNode.Property, objectModel); } else { DbExpression condition = this.ParseCondition(navigationNode.Condition, objectModel, queryModel.ScopeTables); var joinTable = objectModel.DependentTable as DbJoinTableExpression; joinTable.AppendCondition(condition); } } else { if (!handleCollection) { this.IncludeCollections.Add(navigationNode); return; } CollectionObjectModel collectionModel = this.GetCollectionMember(navigationNode.Property); if (collectionModel == null) { Type collectionType = navigationDescriptor.PropertyType; TypeDescriptor elementTypeDescriptor = EntityTypeContainer.GetDescriptor(collectionType.GetGenericArguments()[0]); ComplexObjectModel elementModel = this.GenCollectionElementObjectModel(elementTypeDescriptor, navigationNode, queryModel); collectionModel = new CollectionObjectModel(this.ObjectType, navigationNode.Property, elementModel); this.AddCollectionMember(navigationNode.Property, collectionModel); } else { DbExpression condition = this.ParseCondition(navigationNode.Condition, collectionModel.ElementModel, queryModel.ScopeTables); var joinTable = collectionModel.ElementModel.DependentTable as DbJoinTableExpression; joinTable.AppendCondition(condition); } objectModel = collectionModel.ElementModel; } if (navigationNode.Next != null) { objectModel.Include(navigationNode.Next, queryModel, handleCollection); } }
public void AddCollectionMember(MemberInfo memberInfo, CollectionObjectModel model) { memberInfo = memberInfo.AsReflectedMemberOf(this.ObjectType); this.CollectionMembers.Add(memberInfo, model); }