public override Expression Remap(int offset, Dictionary <Expression, Expression> processedExpressions)
        {
            if (!CanRemap)
            {
                return(this);
            }

            Expression result;

            if (processedExpressions.TryGetValue(this, out result))
            {
                return(result);
            }

            var mapping = new Segment <int>(Mapping.Offset + offset, Mapping.Length);

            result = new FieldExpression(ExtendedExpressionType.Field, Field, mapping, OuterParameter, DefaultIfEmpty);
            if (owner == null)
            {
                return(result);
            }

            processedExpressions.Add(this, result);
            Owner.Remap(offset, processedExpressions);
            return(result);
        }
        public static EntityExpression Create(TypeInfo typeInfo, int offset, bool keyFieldsOnly)
        {
            if (!typeInfo.IsEntity && !typeInfo.IsInterface)
            {
                throw new ArgumentException(string.Format(Strings.ExPersistentTypeXIsNotEntityOrPersistentInterface, typeInfo.Name), "typeInfo");
            }
            var fields        = new List <PersistentFieldExpression>();
            var keyExpression = KeyExpression.Create(typeInfo, offset);

            fields.Add(keyExpression);
            var result = new EntityExpression(typeInfo, keyExpression, null, false);

            if (keyFieldsOnly)
            {
                // Add key fields to field collection
                var keyFieldClones = keyExpression
                                     .KeyFields
                                     .Select(kf => FieldExpression.CreateField(kf.Field, offset))
                                     .Cast <PersistentFieldExpression>();
                fields.AddRange(keyFieldClones);
            }
            else
            {
                foreach (var nestedField in typeInfo.Fields)
                {
                    fields.Add(BuildNestedFieldExpression(nestedField, offset));
                }
            }
            result.Fields = fields;
            return(result);
        }
        public static KeyExpression Create(TypeInfo entityType, int offset)
        {
            var mapping = new Segment <int>(offset, entityType.Key.TupleDescriptor.Count);
            var fields  = entityType.Columns
                          .Where(c => c.IsPrimaryKey)
                          .OrderBy(c => c.Field.MappingInfo.Offset)
                          .Select(c => FieldExpression.CreateField(c.Field, offset))
                          .ToList()
                          .AsReadOnly();

            return(new KeyExpression(entityType, fields, mapping, WellKnownMembers.IEntityKey, null, false));
        }
Beispiel #4
0
// ReSharper disable RedundantNameQualifier
        private static PersistentFieldExpression BuildNestedFieldExpression(FieldInfo nestedField, int offset)
        {
            if (nestedField.IsPrimitive)
            {
                return(FieldExpression.CreateField(nestedField, offset));
            }
            if (nestedField.IsStructure)
            {
                return(StructureFieldExpression.CreateStructure(nestedField, offset));
            }
            if (nestedField.IsEntity)
            {
                return(EntityFieldExpression.CreateEntityField(nestedField, offset));
            }
            throw new NotSupportedException(string.Format(Strings.ExNestedFieldXIsNotSupported, nestedField.Attributes));
        }
        public override Expression RemoveOuterParameter(Dictionary <Expression, Expression> processedExpressions)
        {
            Expression result;

            if (processedExpressions.TryGetValue(this, out result))
            {
                return(result);
            }

            result = new FieldExpression(ExtendedExpressionType.Field, Field, Mapping, null, DefaultIfEmpty);
            if (owner == null)
            {
                return(result);
            }

            processedExpressions.Add(this, result);
            Owner.RemoveOuterParameter(processedExpressions);
            return(result);
        }
        public override Expression Remap(int[] map, Dictionary <Expression, Expression> processedExpressions)
        {
            if (!CanRemap)
            {
                return(this);
            }

            Expression result;

            if (processedExpressions.TryGetValue(this, out result))
            {
                return(result);
            }

            var offset = map.IndexOf(Mapping.Offset);

            if (offset < 0)
            {
                if (owner == null && !SkipOwnerCheckScope.IsActive)
                {
                    throw new InvalidOperationException(Strings.ExUnableToRemapFieldExpression);
                }
                processedExpressions.Add(this, null);
                if (owner != null)
                {
                    Owner.Remap(map, processedExpressions);
                }
                return(null);
            }
            var mapping = new Segment <int>(offset, Mapping.Length);

            result = new FieldExpression(ExtendedExpressionType.Field, Field, mapping, OuterParameter, DefaultIfEmpty);
            if (owner == null)
            {
                return(result);
            }

            processedExpressions.Add(this, result);
            Owner.Remap(map, processedExpressions);
            return(result);
        }
        public override Expression Remap(int[] map, Dictionary <Expression, Expression> processedExpressions)
        {
            if (!CanRemap)
            {
                return(this);
            }

            if (processedExpressions.TryGetValue(this, out var value))
            {
                return(value);
            }

            var segment = new Segment <int>(map.IndexOf(Mapping.Offset), Mapping.Length);
            var fields  = new FieldExpression[KeyFields.Count];

            using (new SkipOwnerCheckScope()) {
                for (var index = 0; index < fields.Length; index++)
                {
                    var field = (FieldExpression)KeyFields[index].Remap(map, processedExpressions);
                    if (field == null)
                    {
                        if (SkipOwnerCheckScope.IsActive)
                        {
                            processedExpressions.Add(this, null);
                            return(null);
                        }
                        throw Exceptions.InternalError(Strings.ExUnableToRemapKeyExpression, OrmLog.Instance);
                    }

                    fields[index] = field;
                }
            }
            var result = new KeyExpression(EntityType, fields, segment, UnderlyingProperty, OuterParameter, DefaultIfEmpty);

            processedExpressions.Add(this, result);
            return(result);
        }