コード例 #1
0
        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);
            }
        }
コード例 #2
0
        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);
        }