Пример #1
0
        public OeEntryFactory CreateEntryFactory(Type entityType, IEdmEntitySetBase entitySet, Type sourceType)
        {
            ParameterExpression parameter = Expression.Parameter(typeof(Object));
            IReadOnlyList <MemberExpression> itemExpressions = OeExpressionHelper.GetPropertyExpression(Expression.Convert(parameter, sourceType));

            OeEntryFactory        entryFactory;
            List <OeEntryFactory> navigationLinks = GetNavigationLinks(itemExpressions, parameter);

            if (_pathSelect)
            {
                var accessors = new List <OePropertyAccessor>(_selectItemInfos.Count);
                for (int i = 0; i < _selectItemInfos.Count; i++)
                {
                    SelectItemInfo info = _selectItemInfos[i];
                    if (info.EdmProperty is IEdmStructuralProperty)
                    {
                        accessors.Add(OePropertyAccessor.CreatePropertyAccessor(info.EdmProperty, itemExpressions[i], parameter));
                    }
                }
                entryFactory = OeEntryFactory.CreateEntryFactoryParent(entitySet, accessors.ToArray(), navigationLinks);
            }
            else
            {
                OePropertyAccessor[] accessors = OePropertyAccessor.CreateFromType(entityType, entitySet);
                entryFactory = OeEntryFactory.CreateEntryFactoryParent(entitySet, accessors, navigationLinks);
                entryFactory.LinkAccessor = (Func <Object, Object>)Expression.Lambda(itemExpressions[0], parameter).Compile();
            }
            return(entryFactory);
        }
Пример #2
0
        private List <OeEntryFactory> GetNavigationLinks(IReadOnlyList <MemberExpression> itemExpressions, ParameterExpression parameter)
        {
            var navigationLinks = new List <OeEntryFactory>(_selectItemInfos.Count);

            for (int i = 0; i < _selectItemInfos.Count; i++)
            {
                SelectItemInfo itemInfo = _selectItemInfos[i];
                if (itemInfo.EdmProperty is IEdmNavigationProperty)
                {
                    MemberExpression expression = itemExpressions[_pathSelect ? i : i + 1];

                    OeEntryFactory entryFactory;
                    if (itemInfo.EntryFactory == null)
                    {
                        Type type = expression.Type;
                        if (itemInfo.ResourceInfo.IsCollection.GetValueOrDefault())
                        {
                            type = OeExpressionHelper.GetCollectionItemType(type);
                        }

                        OePropertyAccessor[] accessors = OePropertyAccessor.CreateFromType(type, itemInfo.EntitySet);
                        entryFactory             = OeEntryFactory.CreateEntryFactoryChild(itemInfo.EntitySet, accessors, itemInfo.ResourceInfo);
                        entryFactory.CountOption = itemInfo.CountOption;
                    }
                    else
                    {
                        entryFactory = itemInfo.EntryFactory;
                    }
                    entryFactory.LinkAccessor = (Func <Object, Object>)Expression.Lambda(expression, parameter).Compile();

                    navigationLinks.Add(entryFactory);
                }
            }
            return(navigationLinks);
        }
Пример #3
0
        private OeEntryFactory CreateEntryFactoryFromTuple(IEdmModel edmModel, OeEntryFactory?parentEntryFactory, OePropertyAccessor[] skipTokenAccessors)
        {
            OePropertyAccessor[] accessors = _allAccessors;
            if (IsTuple)
            {
                OePropertyAccessor[] propertyAccessors = OePropertyAccessor.CreateFromType(edmModel.GetClrType(EntitySet), EntitySet);
                accessors = new OePropertyAccessor[_allAccessors.Length];
                for (int i = 0; i < accessors.Length; i++)
                {
                    OePropertyAccessor accessor = Array.Find(propertyAccessors, pa => pa.EdmProperty == _allAccessors[i].EdmProperty);
                    if (Array.IndexOf(Accessors, _allAccessors[i]) == -1)
                    {
                        var convertExpression   = (UnaryExpression)accessor.PropertyExpression.Expression;
                        var parameterExpression = (ParameterExpression)convertExpression.Operand;
                        accessor = OePropertyAccessor.CreatePropertyAccessor(accessor.EdmProperty, accessor.PropertyExpression, parameterExpression, true);
                    }
                    accessors[i] = accessor;
                }
            }

            var navigationLinks = new OeEntryFactory[NavigationLinks.Count];

            for (int i = 0; i < NavigationLinks.Count; i++)
            {
                navigationLinks[i] = NavigationLinks[i].CreateEntryFactoryFromTuple(edmModel, this, Array.Empty <OePropertyAccessor>());
            }

            OeEntryFactoryOptions options;

            if (parentEntryFactory == null)
            {
                options = new OeEntryFactoryOptions()
                {
                    Accessors          = accessors,
                    EntitySet          = EntitySet,
                    NavigationLinks    = navigationLinks,
                    SkipTokenAccessors = skipTokenAccessors,
                };
                return(new OeEntryFactory(ref options));
            }

            ParameterExpression parameter      = Expression.Parameter(typeof(Object));
            UnaryExpression     typedParameter = Expression.Convert(parameter, edmModel.GetClrType(parentEntryFactory.EntitySet));
            MemberExpression    navigationPropertyExpression = Expression.Property(typedParameter, EdmNavigationProperty.Name);
            LambdaExpression    linkAccessor = Expression.Lambda(navigationPropertyExpression, parameter);

            options = new OeEntryFactoryOptions()
            {
                Accessors             = accessors,
                EdmNavigationProperty = EdmNavigationProperty,
                EntitySet             = EntitySet,
                LinkAccessor          = linkAccessor,
                NavigationLinks       = navigationLinks,
                NavigationSelectItem  = NavigationSelectItem,
                SkipTokenAccessors    = skipTokenAccessors,
            };
            return(new OeEntryFactory(ref options));
        }
Пример #4
0
        public OeEntryFactory CreateEntryFactory(IEdmEntitySet entitySet)
        {
            if (_entryFactoryFactory != null)
            {
                return(_entryFactoryFactory(entitySet, ParameterType));
            }

            OePropertyAccessor[] accessors = OePropertyAccessor.CreateFromType(ParameterType, entitySet);
            return(OeEntryFactory.CreateEntryFactory(entitySet, accessors));
        }
Пример #5
0
 public OeQueryContext CreateQueryContext(ODataUri odataUri, IEdmEntitySet entitySet, OeMetadataLevel metadataLevel)
 {
     OePropertyAccessor[]  accessors        = OePropertyAccessor.CreateFromType(_edmModel.GetClrType(entitySet), entitySet);
     Db.OeEntitySetAdapter entitySetAdapter = _dataAdapter.EntitySetAdapters.Find(entitySet);
     return(new OeQueryContext(_edmModel, odataUri, entitySetAdapter)
     {
         EntryFactory = new OeEntryFactory(entitySet, accessors, null),
         MetadataLevel = metadataLevel
     });
 }
Пример #6
0
 public OeEntryFactory CreateEntryFactory(Type entityType, IEdmEntitySet entitySet, Type sourceType)
 {
     OePropertyAccessor[] accessors;
     if (_aggProperties.Count == 0)
     {
         accessors = OePropertyAccessor.CreateFromType(entityType, entitySet);
     }
     else
     {
         accessors = OePropertyAccessor.CreateFromTuple(sourceType, _aggProperties, 0);
     }
     return(OeEntryFactory.CreateEntryFactory(entitySet, accessors));
 }
Пример #7
0
 public OeEntryFactory CreateEntryFactory(Type entityType, IEdmEntitySet entitySet, Type sourceType)
 {
     OePropertyAccessor[] accessors;
     if (_aggProperties.Count == 0)
     {
         accessors = OePropertyAccessor.CreateFromType(entityType, entitySet);
     }
     else
     {
         int groupIndex = _aggProperties.FindIndex(a => a.IsGroup);
         accessors = OePropertyAccessor.CreateFromTuple(sourceType, _aggProperties, groupIndex);
     }
     return(OeEntryFactory.CreateEntryFactory(entitySet, accessors));
 }
Пример #8
0
        public OeQueryContext CreateQueryContext(ODataUri odataUri, OeMetadataLevel metadataLevel)
        {
            var importSegment = (OperationImportSegment)odataUri.Path.FirstSegment;
            IEdmEntitySet entitySet = OeOperationHelper.GetEntitySet(importSegment.OperationImports.Single());
            if (entitySet == null)
                return null;

            Type clrType = _edmModel.GetClrType(entitySet.EntityType());
            OePropertyAccessor[] accessors = OePropertyAccessor.CreateFromType(clrType, entitySet);

            Db.OeEntitySetAdapter entitySetAdapter = _dataAdapter.EntitySetAdapters.Find(entitySet);
            return new OeQueryContext(_edmModel, odataUri, null, false, 0, false, metadataLevel, entitySetAdapter)
            {
                EntryFactory = OeEntryFactory.CreateEntryFactory(entitySet, accessors),
            };
        }
Пример #9
0
        public OeQueryContext CreateQueryContext(ODataUri odataUri, OeMetadataLevel metadataLevel)
        {
            var           importSegment = (OperationImportSegment)odataUri.Path.FirstSegment;
            IEdmEntitySet entitySet     = OeOperationHelper.GetEntitySet(importSegment.OperationImports.Single());

            if (entitySet == null)
            {
                return(null);
            }

            OePropertyAccessor[]  accessors        = OePropertyAccessor.CreateFromType(_edmModel.GetClrType(entitySet), entitySet);
            Db.OeEntitySetAdapter entitySetAdapter = _dataAdapter.EntitySetAdapters.Find(entitySet);
            return(new OeQueryContext(_edmModel, odataUri, entitySetAdapter)
            {
                EntryFactory = new OeEntryFactory(entitySet, accessors, Array.Empty <OePropertyAccessor>()),
                MetadataLevel = metadataLevel
            });
        }
Пример #10
0
        private OeEntryFactory CreateEntryFactory(OeExpressionBuilder expressionBuilder)
        {
            IEdmEntitySet entitySet;

            if (ODataUri.Path.LastSegment is OperationSegment)
            {
                entitySet = OeOperationHelper.GetEntitySet(ODataUri.Path);
                Type clrEntityType             = EdmModel.GetClrType(entitySet.EntityType());
                OePropertyAccessor[] accessors = OePropertyAccessor.CreateFromType(clrEntityType, entitySet);
                return(OeEntryFactory.CreateEntryFactory(entitySet, accessors));
            }

            entitySet = OeParseNavigationSegment.GetEntitySet(ParseNavigationSegments);
            if (entitySet == null)
            {
                entitySet = OeEdmClrHelper.GetEntitySet(EdmModel, EntitySetAdapter.EntitySetName);
            }

            return(expressionBuilder.CreateEntryFactory(entitySet));
        }
Пример #11
0
 protected OePropertyAccessor[] GetAccessorsFromTuple(IEdmModel edmModel)
 {
     OePropertyAccessor[] accessors = _allAccessors;
     if (IsTuple)
     {
         OePropertyAccessor[] propertyAccessors = OePropertyAccessor.CreateFromType(edmModel.GetClrType(EntitySet), EntitySet);
         accessors = new OePropertyAccessor[_allAccessors.Length];
         for (int i = 0; i < accessors.Length; i++)
         {
             OePropertyAccessor accessor = Array.Find(propertyAccessors, pa => pa.EdmProperty == _allAccessors[i].EdmProperty);
             if (Array.IndexOf(Accessors, _allAccessors[i]) == -1)
             {
                 var convertExpression   = (UnaryExpression)accessor.PropertyExpression.Expression;
                 var parameterExpression = (ParameterExpression)convertExpression.Operand;
                 accessor = OePropertyAccessor.CreatePropertyAccessor(accessor.EdmProperty, accessor.PropertyExpression, parameterExpression, true);
             }
             accessors[i] = accessor;
         }
     }
     return(accessors);
 }
Пример #12
0
        private OeEntryFactory CreateEntryFactoryFromTuple(OeEntryFactory parentEntryFactory)
        {
            OePropertyAccessor[] accessors = _allAccessors;
            if (IsTuple)
            {
                accessors = new OePropertyAccessor[_allAccessors.Length];
                OePropertyAccessor[] propertyAccessors = OePropertyAccessor.CreateFromType(ClrEntityType, EntitySet);
                for (int i = 0; i < accessors.Length; i++)
                {
                    OePropertyAccessor accessor = Array.Find(propertyAccessors, pa => pa.EdmProperty == _allAccessors[i].EdmProperty);
                    if (Array.IndexOf(Accessors, _allAccessors[i]) == -1)
                    {
                        var convertExpression   = (UnaryExpression)accessor.PropertyExpression.Expression;
                        var parameterExpression = (ParameterExpression)convertExpression.Operand;
                        accessor = OePropertyAccessor.CreatePropertyAccessor(accessor.EdmProperty, accessor.PropertyExpression, parameterExpression, true);
                    }
                    accessors[i] = accessor;
                }
            }

            var navigationLinks = new OeEntryFactory[NavigationLinks.Count];

            for (int i = 0; i < NavigationLinks.Count; i++)
            {
                navigationLinks[i] = NavigationLinks[i].CreateEntryFactoryFromTuple(this);
            }

            if (parentEntryFactory == null)
            {
                return(OeEntryFactory.CreateEntryFactoryParent(ClrEntityType, EntitySet, accessors, navigationLinks, null));
            }

            ParameterExpression parameter      = Expression.Parameter(typeof(Object));
            UnaryExpression     typedParameter = Expression.Convert(parameter, parentEntryFactory.ClrEntityType);
            MemberExpression    navigationPropertyExpression = Expression.Property(typedParameter, ResourceInfo.Name);
            LambdaExpression    linkAccessor = Expression.Lambda(navigationPropertyExpression, parameter);

            return(OeEntryFactory.CreateEntryFactoryNested(ClrEntityType, EntitySet, accessors, navigationLinks, linkAccessor, ResourceInfo));
        }