private static bool ExpressionsCompatible(DbExpression x, DbExpression y) { if (x.ExpressionKind != y.ExpressionKind) { return(false); } switch (x.ExpressionKind) { case DbExpressionKind.NewInstance: DbNewInstanceExpression instanceExpression1 = (DbNewInstanceExpression)x; DbNewInstanceExpression instanceExpression2 = (DbNewInstanceExpression)y; if (!instanceExpression1.ResultType.EdmType.EdmEquals((MetadataItem)instanceExpression2.ResultType.EdmType)) { return(false); } for (int index = 0; index < instanceExpression1.Arguments.Count; ++index) { if (!DiscriminatorMap.ExpressionsCompatible(instanceExpression1.Arguments[index], instanceExpression2.Arguments[index])) { return(false); } } return(true); case DbExpressionKind.Property: DbPropertyExpression propertyExpression1 = (DbPropertyExpression)x; DbPropertyExpression propertyExpression2 = (DbPropertyExpression)y; if (propertyExpression1.Property == propertyExpression2.Property) { return(DiscriminatorMap.ExpressionsCompatible(propertyExpression1.Instance, propertyExpression2.Instance)); } return(false); case DbExpressionKind.Ref: DbRefExpression dbRefExpression1 = (DbRefExpression)x; DbRefExpression dbRefExpression2 = (DbRefExpression)y; if (dbRefExpression1.EntitySet.EdmEquals((MetadataItem)dbRefExpression2.EntitySet)) { return(DiscriminatorMap.ExpressionsCompatible(dbRefExpression1.Argument, dbRefExpression2.Argument)); } return(false); case DbExpressionKind.VariableReference: return(((DbVariableReferenceExpression)x).VariableName == ((DbVariableReferenceExpression)y).VariableName); default: return(false); } }
private static bool TryMatchEntityTypeConstructor( DbExpression then, Dictionary <EdmProperty, DbExpression> propertyMap, Dictionary <RelProperty, DbExpression> relPropertyMap, Dictionary <EntityType, List <RelProperty> > typeToRelPropertyMap, out EntityType entityType) { if (then.ExpressionKind != DbExpressionKind.NewInstance) { entityType = (EntityType)null; return(false); } DbNewInstanceExpression instanceExpression = (DbNewInstanceExpression)then; entityType = (EntityType)instanceExpression.ResultType.EdmType; for (int index = 0; index < entityType.Properties.Count; ++index) { EdmProperty property = entityType.Properties[index]; DbExpression x = instanceExpression.Arguments[index]; DbExpression y; if (propertyMap.TryGetValue(property, out y)) { if (!DiscriminatorMap.ExpressionsCompatible(x, y)) { return(false); } } else { propertyMap.Add(property, x); } } if (instanceExpression.HasRelatedEntityReferences) { List <RelProperty> relPropertyList; if (!typeToRelPropertyMap.TryGetValue(entityType, out relPropertyList)) { relPropertyList = new List <RelProperty>(); typeToRelPropertyMap[entityType] = relPropertyList; } foreach (DbRelatedEntityRef relatedEntityReference in instanceExpression.RelatedEntityReferences) { RelProperty key = new RelProperty((RelationshipType)relatedEntityReference.TargetEnd.DeclaringType, relatedEntityReference.SourceEnd, relatedEntityReference.TargetEnd); DbExpression targetEntityReference = relatedEntityReference.TargetEntityReference; DbExpression y; if (relPropertyMap.TryGetValue(key, out y)) { if (!DiscriminatorMap.ExpressionsCompatible(targetEntityReference, y)) { return(false); } } else { relPropertyMap.Add(key, targetEntityReference); } relPropertyList.Add(key); } } return(true); }