public static EntityFieldExpression CreateEntityField(FieldInfo entityField, int offset)
        {
            if (!entityField.IsEntity)
            {
                throw new ArgumentException(string.Format(Strings.ExFieldXIsNotEntity, entityField.Name), nameof(entityField));
            }

            var entityType     = entityField.ValueType;
            var persistentType = entityField.ReflectedType.Model.Types[entityType];

            var mappingInfo   = entityField.MappingInfo;
            var mapping       = new Segment <int>(mappingInfo.Offset + offset, mappingInfo.Length);
            var keyFields     = persistentType.Key.Fields;
            var keyExpression = KeyExpression.Create(persistentType, offset + mappingInfo.Offset);
            var fields        = new List <PersistentFieldExpression>(keyFields.Count + 1)
            {
                keyExpression
            };

            foreach (var field in keyFields)
            {
                // Do not convert to LINQ. We want to avoid a closure creation here.
                fields.Add(BuildNestedFieldExpression(field, offset + mappingInfo.Offset));
            }

            return(new EntityFieldExpression(persistentType, entityField, fields, mapping, keyExpression, null, null, false));
        }
        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);
        }
Ejemplo n.º 3
0
        public static EntityFieldExpression CreateEntityField(FieldInfo entityField, int offset)
        {
            if (!entityField.IsEntity)
            {
                throw new ArgumentException(string.Format(Strings.ExFieldXIsNotEntity, entityField.Name), "entityField");
            }
            var entityType     = entityField.ValueType;
            var persistentType = entityField.ReflectedType.Model.Types[entityType];
            var mapping        = new Segment <int>(entityField.MappingInfo.Offset + offset, entityField.MappingInfo.Length);
            var fields         = new List <PersistentFieldExpression>();
            var keyExpression  = KeyExpression.Create(persistentType, offset + entityField.MappingInfo.Offset);

            fields.Add(keyExpression);
            foreach (var keyField in persistentType.Fields.Where(f => f.IsPrimaryKey))
            {
                fields.Add(BuildNestedFieldExpression(keyField, offset + entityField.MappingInfo.Offset));
            }
            return(new EntityFieldExpression(persistentType, entityField, fields, mapping, keyExpression, null, null, false));
        }
        public static EntityExpression Create(EntityFieldExpression entityFieldExpression, int offset)
        {
            var typeInfo      = entityFieldExpression.PersistentType;
            var fields        = new List <PersistentFieldExpression>();
            var keyExpression = KeyExpression.Create(typeInfo, offset);

            fields.Add(keyExpression);
            foreach (var nestedField in typeInfo.Fields)
            {
                fields.Add(BuildNestedFieldExpression(nestedField, offset));
            }
            var result = new EntityExpression(typeInfo, keyExpression, null, entityFieldExpression.DefaultIfEmpty)
            {
                Fields = fields
            };

            if (entityFieldExpression.OuterParameter == null)
            {
                return(result);
            }
            return((EntityExpression)result.BindParameter(entityFieldExpression.OuterParameter, new Dictionary <Expression, Expression>()));
        }