Exemple #1
0
        private static OeEntryFactory CreateEntryFactory(IEdmModel edmModel, OeSelectItem root, Type clrType)
        {
            ParameterExpression parameter      = Expression.Parameter(typeof(Object));
            UnaryExpression     typedParameter = Expression.Convert(parameter, clrType);

            if (root.HasNavigationItems)
            {
                List <OeSelectItem> navigationItems = FlattenNavigationItems(root, false);
                IReadOnlyList <MemberExpression> navigationProperties = OeExpressionHelper.GetPropertyExpressions(typedParameter);

                for (int i = navigationItems.Count - 1; i >= 0; i--)
                {
                    OeSelectItem     navigationItem        = navigationItems[i];
                    OeEntryFactory[] nestedNavigationLinks = GetNestedNavigationLinks(navigationItem);

                    OeEntryFactory       entryFactory;
                    Type                 clrEntityType = edmModel.GetClrType(navigationItem.EntitySet);
                    OePropertyAccessor[] accessors     = GetAccessors(navigationProperties[i].Type, navigationItem.EntitySet, navigationItem.SelectItems);
                    LambdaExpression     linkAccessor  = Expression.Lambda(navigationProperties[i], parameter);
                    if (i == 0)
                    {
                        entryFactory = OeEntryFactory.CreateEntryFactoryParent(clrEntityType, navigationItem.EntitySet, accessors, nestedNavigationLinks, linkAccessor);
                    }
                    else
                    {
                        var resourceInfo = new ODataNestedResourceInfo()
                        {
                            IsCollection = navigationItem.EdmProperty.Type.Definition is EdmCollectionType,
                            Name         = navigationItem.EdmProperty.Name
                        };
                        entryFactory             = OeEntryFactory.CreateEntryFactoryNested(clrEntityType, navigationItem.EntitySet, accessors, nestedNavigationLinks, linkAccessor, resourceInfo);
                        entryFactory.CountOption = navigationItem.ExpandedNavigationSelectItem.CountOption;
                    }
                    navigationItem.EntryFactory = entryFactory;
                }
            }
            else
            {
                IReadOnlyList <MemberExpression> propertyExpressions = OeExpressionHelper.GetPropertyExpressions(typedParameter);
                OePropertyAccessor[]             accessors;
                if (root.SelectItems.Count == 0)
                {
                    accessors = OePropertyAccessor.CreateFromType(typedParameter.Type, root.EntitySet);
                }
                else
                {
                    var accessorList = new List <OePropertyAccessor>(root.SelectItems.Count);
                    for (int i = 0; i < root.SelectItems.Count; i++)
                    {
                        OeSelectItem selectItem = root.SelectItems[i];
                        accessorList.Add(OePropertyAccessor.CreatePropertyAccessor(selectItem.EdmProperty, propertyExpressions[i], parameter, selectItem.SkipToken));
                    }
                    accessors = accessorList.ToArray();
                }
                Type clrEntityType = edmModel.GetClrType(root.EntitySet);
                root.EntryFactory = OeEntryFactory.CreateEntryFactory(clrEntityType, root.EntitySet, accessors);
            }

            return(root.EntryFactory);
        }
Exemple #2
0
        public OeQueryContext CreateQueryContext(ODataUri odataUri, OeMetadataLevel metadataLevel, Type returnClrType)
        {
            String        entitySetName = _dataAdapter.EntitySetMetaAdapters.FindByClrType(returnClrType).EntitySetName;
            IEdmEntitySet entitySet     = _model.FindDeclaredEntitySet(entitySetName);

            OePropertyAccessor[] accessors = OePropertyAccessor.CreateFromType(returnClrType, entitySet);

            Db.OeEntitySetAdapter entitySetAdapter = _dataAdapter.GetEntitySetAdapter(entitySet.Name);
            return(new OeQueryContext(_model, odataUri, entitySet, null, false, 0, false,
                                      _dataAdapter.IsDatabaseNullHighestValue, metadataLevel, ref entitySetAdapter)
            {
                EntryFactory = OeEntryFactory.CreateEntryFactory(entitySet, accessors),
            });
        }
Exemple #3
0
        public OeEntryFactory CreateEntryFactory(IEdmEntitySet entitySet, Type clrType)
        {
            OePropertyAccessor[] accessors;
            if (_aggProperties.Count == 0)
            {
                accessors = OePropertyAccessor.CreateFromType(clrType, entitySet);
            }
            else
            {
                int groupIndex = _aggProperties.FindIndex(a => a.IsGroup);
                accessors = OePropertyAccessor.CreateFromTuple(clrType, _aggProperties, groupIndex);
            }

            return(OeEntryFactory.CreateEntryFactory(entitySet, accessors));
        }
        private static OeEntryFactory CreateEntryFactory(IEdmModel edmModel, Expression source, Type entityType, List <AggProperty> _aggProperties)
        {
            IEdmEntitySet entitySet = OeEdmClrHelper.GetEntitySet(edmModel, entityType);

            OePropertyAccessor[] accessors;
            if (_aggProperties.Count == 0)
            {
                accessors = OePropertyAccessor.CreateFromType(entityType, entitySet);
            }
            else
            {
                Type sourceItemType = OeExpressionHelper.GetCollectionItemType(source.Type);
                int  groupIndex     = _aggProperties.FindIndex(a => a.IsGroup);
                accessors = OePropertyAccessor.CreateFromTuple(sourceItemType, _aggProperties, groupIndex);
            }

            return(OeEntryFactory.CreateEntryFactory(entitySet, accessors));
        }