public override OeSelectItem Translate(ExpandedNavigationSelectItem item) { if (_navigationNextLink && Cache.UriCompare.OeComparerExtension.GetNavigationNextLink(item)) { return(null); } Type itemType; IEdmNavigationProperty navigationProperty = (((NavigationPropertySegment)item.PathToNavigationProperty.LastSegment).NavigationProperty); OeSelectItem navigationItem = _navigationItem.FindChildrenNavigationItem(navigationProperty); if (navigationItem == null) { navigationItem = new OeSelectItem(_navigationItem, item, _skipToken); _navigationItem.AddNavigationItem(navigationItem); Expression innerSource = GetInnerSource(navigationItem, item); _source = _joinBuilder.Build(_source, innerSource, _navigationItem.GetJoinPath(), navigationProperty); itemType = OeExpressionHelper.GetCollectionItemType(innerSource.Type); } else { itemType = _visitor.EdmModel.GetClrType(navigationItem.EntitySet.EntityType()); } var selectTranslator = new OeSelectTranslator(_joinBuilder, navigationItem); _source = selectTranslator.BuildSelect(item.SelectAndExpand, _source, _navigationNextLink, _skipToken); return(navigationItem); }
public Expression ApplySelect(Expression source, OeQueryContext queryContext) { if (queryContext.ODataUri.Path.LastSegment is CountSegment) { return(source); } var selectTranslator = new Translators.OeSelectTranslator(_joinBuilder, queryContext.ODataUri.Path, queryContext.MetadataLevel); source = selectTranslator.Build(source, queryContext); _entryFactoryFactory = selectTranslator.CreateEntryFactory; ChangeParameterType(source); return(source); }
public Expression ApplySelect(Expression source, OeQueryContext queryContext) { if (queryContext.ODataUri.Path.LastSegment is CountSegment) { return(source); } var selectTranslator = new Translators.OeSelectTranslator(queryContext.EdmModel, _joinBuilder, queryContext.ODataUri); var selectTranslatorParameters = new Translators.OeSelectTranslatorParameters() { IsDatabaseNullHighestValue = queryContext.IsDatabaseNullHighestValue, MetadataLevel = queryContext.MetadataLevel, SkipTokenNameValues = queryContext.SkipTokenNameValues }; source = selectTranslator.Build(source, ref selectTranslatorParameters, out _entryFactoryFactory); ChangeParameterType(source); return(source); }
public override OeEntryFactory CreateEntryFactory(IEdmEntitySet entitySet, Type clrType, OePropertyAccessor[]?skipTokenAccessors) { ParameterExpression parameter = Expression.Parameter(typeof(Object)); UnaryExpression typedParameter = Expression.Convert(parameter, clrType); if (_rootNavigationItem.HasNavigationItems()) { List <OeNavigationSelectItem> navigationItems = OeSelectTranslator.FlattenNavigationItems(_rootNavigationItem, true); IReadOnlyList <MemberExpression> navigationProperties = OeExpressionHelper.GetPropertyExpressions(typedParameter); int propertyIndex = navigationProperties.Count - 1; for (int i = navigationItems.Count - 1; i >= 0; i--) { OeNavigationSelectItem navigationItem = navigationItems[i]; if (navigationItem.Kind == OeNavigationSelectItemKind.NotSelected) { propertyIndex--; continue; } OePropertyAccessor[] accessors = Array.Empty <OePropertyAccessor>(); LambdaExpression? linkAccessor = null; OeNavigationEntryFactory[] nestedNavigationLinks = Array.Empty <OeNavigationEntryFactory>(); if (navigationItem.Kind != OeNavigationSelectItemKind.NextLink) { accessors = GetAccessors(navigationProperties[propertyIndex].Type, navigationItem); linkAccessor = Expression.Lambda(navigationProperties[propertyIndex], parameter); nestedNavigationLinks = GetNestedNavigationLinks(navigationItem); propertyIndex--; } if (i == 0) { navigationItem.EntryFactory = new OeEntryFactory(navigationItem.EntitySet, accessors, skipTokenAccessors, nestedNavigationLinks, linkAccessor); } else { navigationItem.EntryFactory = new OeNavigationEntryFactory( navigationItem.EntitySet, accessors, skipTokenAccessors, nestedNavigationLinks, linkAccessor, navigationItem.EdmProperty, navigationItem.NavigationSelectItem, navigationItem.Kind == OeNavigationSelectItemKind.NextLink); } } } else { var navigationLinks = new OeNavigationEntryFactory[_rootNavigationItem.NavigationItems.Count]; for (int i = 0; i < _rootNavigationItem.NavigationItems.Count; i++) { OeNavigationSelectItem navigationItem = _rootNavigationItem.NavigationItems[i]; navigationLinks[i] = new OeNavigationEntryFactory( navigationItem.EntitySet, Array.Empty <OePropertyAccessor>(), null, Array.Empty <OeNavigationEntryFactory>(), null, navigationItem.EdmProperty, navigationItem.NavigationSelectItem, navigationItem.Kind == OeNavigationSelectItemKind.NextLink); } OePropertyAccessor[] accessors = GetAccessors(clrType, _rootNavigationItem); _rootNavigationItem.EntryFactory = new OeEntryFactory(_rootNavigationItem.EntitySet, accessors, skipTokenAccessors, navigationLinks); } return(_rootNavigationItem.EntryFactory); }