private static void SnapExpandedEntry(List <DeltaSnapshotEntry> results, object element, IEdmNavigationSource edmParent, IEnumerable <ExpandedNavigationSelectItem> expandedNavigationItems, string parentId) { foreach (var navigationProperty in ((IEdmEntityType)EdmClrTypeUtils.GetEdmType(DataSourceManager.GetCurrentDataSource().Model, element)).NavigationProperties()) { var expandedNavigationItem = GetExpandedNavigationItem(expandedNavigationItems, navigationProperty.Name); if (expandedNavigationItem != null) { bool isCollection = navigationProperty.Type.IsCollection(); ExpandSelectItemHandler expandItemHandler = new ExpandSelectItemHandler(element); expandedNavigationItem.HandleWith(expandItemHandler); var propertyValue = expandItemHandler.ExpandedChildElement; if (propertyValue != null) { IEdmNavigationSource targetSource = edmParent.FindNavigationTarget(navigationProperty); if (isCollection) { SnapResults(results, propertyValue as IEnumerable, targetSource as IEdmEntitySetBase, expandedNavigationItem.SelectAndExpand, parentId, navigationProperty.Name); } else { SnapResult(results, propertyValue, targetSource, expandedNavigationItem.SelectAndExpand, parentId, navigationProperty.Name); } } } } }
private static void SnapExpandedEntry(List<DeltaSnapshotEntry> results, object element, IEdmNavigationSource edmParent, IEnumerable<ExpandedNavigationSelectItem> expandedNavigationItems, string parentId) { foreach (var navigationProperty in ((IEdmEntityType)EdmClrTypeUtils.GetEdmType(DataSourceManager.GetCurrentDataSource().Model, element)).NavigationProperties()) { var expandedNavigationItem = GetExpandedNavigationItem(expandedNavigationItems, navigationProperty.Name); if (expandedNavigationItem != null) { bool isCollection = navigationProperty.Type.IsCollection(); ExpandSelectItemHandler expandItemHandler = new ExpandSelectItemHandler(element); expandedNavigationItem.HandleWith(expandItemHandler); var propertyValue = expandItemHandler.ExpandedChildElement; if (propertyValue != null) { IEdmNavigationSource targetSource = edmParent.FindNavigationTarget(navigationProperty); if (isCollection) { SnapResults(results, propertyValue as IEnumerable, targetSource as IEdmEntitySetBase, expandedNavigationItem.SelectAndExpand, parentId, navigationProperty.Name); } else { SnapResult(results, propertyValue, targetSource, expandedNavigationItem.SelectAndExpand, parentId, navigationProperty.Name); } } } } }
/// <summary> /// Writes an OData entry. /// </summary> /// <param name="writer">The ODataWriter that will write the entry.</param> /// <param name="element">The item from the data store to write.</param> /// <param name="navigationSource">The navigation source in the model that the entry belongs to.</param> /// <param name="model">The data store model.</param> /// <param name="targetVersion">The OData version this segment is targeting.</param> /// <param name="selectExpandClause">The SelectExpandClause.</param> public static void WriteEntry(ODataWriter writer, object element, IEdmNavigationSource entitySource, ODataVersion targetVersion, SelectExpandClause selectExpandClause, Dictionary<string, string> incomingHeaders = null) { var entry = ODataObjectModelConverter.ConvertToODataEntry(element, entitySource, targetVersion); entry.ETag = Utility.GetETagValue(element); if (selectExpandClause != null && selectExpandClause.SelectedItems.OfType<PathSelectItem>().Any()) { ExpandSelectItemHandler selectItemHandler = new ExpandSelectItemHandler(entry); foreach (var item in selectExpandClause.SelectedItems.OfType<PathSelectItem>()) { item.HandleWith(selectItemHandler); } entry = selectItemHandler.ProjectedEntry; } CustomizeEntry(incomingHeaders, entry); writer.WriteStart(entry); // gets all of the expandedItems, including ExpandedRefernceSelectItem and ExpandedNavigationItem var expandedItems = selectExpandClause == null ? null : selectExpandClause.SelectedItems.OfType<ExpandedReferenceSelectItem>(); WriteNavigationLinks(writer, element, entry.ReadLink, entitySource, targetVersion, expandedItems); writer.WriteEnd(); }
/// <summary> /// Writes an OData entry. /// </summary> /// <param name="writer">The ODataWriter that will write the entry.</param> /// <param name="element">The item from the data store to write.</param> /// <param name="navigationSource">The navigation source in the model that the entry belongs to.</param> /// <param name="model">The data store model.</param> /// <param name="targetVersion">The OData version this segment is targeting.</param> /// <param name="selectExpandClause">The SelectExpandClause.</param> public static void WriteEntry(ODataWriter writer, object element, IEdmNavigationSource entitySource, ODataVersion targetVersion, SelectExpandClause selectExpandClause, Dictionary <string, string> incomingHeaders = null) { var entry = ODataObjectModelConverter.ConvertToODataEntry(element, entitySource, targetVersion); entry.ETag = Utility.GetETagValue(element); if (selectExpandClause != null && selectExpandClause.SelectedItems.OfType <PathSelectItem>().Any()) { ExpandSelectItemHandler selectItemHandler = new ExpandSelectItemHandler(entry); foreach (var item in selectExpandClause.SelectedItems.OfType <PathSelectItem>()) { item.HandleWith(selectItemHandler); } entry = selectItemHandler.ProjectedEntry; } CustomizeEntry(incomingHeaders, entry); writer.WriteStart(entry); // gets all of the expandedItems, including ExpandedRefernceSelectItem and ExpandedNavigationItem var expandedItems = selectExpandClause == null ? null : selectExpandClause.SelectedItems.OfType <ExpandedReferenceSelectItem>(); WriteNavigationLinks(writer, element, entry.ReadLink, entitySource, targetVersion, expandedItems); writer.WriteEnd(); }
private static void WriteNavigationLinks(ODataWriter writer, object element, Uri parentEntryUri, IEdmNavigationSource edmParent, ODataVersion targetVersion, IEnumerable <ExpandedNavigationSelectItem> expandedNavigationItems) { foreach (var navigationProperty in ((IEdmEntityType)EdmClrTypeUtils.GetEdmType(DataSourceManager.GetCurrentDataSource().Model, element)).NavigationProperties()) { var expandedNavigationItem = GetExpandedNavigationItem(expandedNavigationItems, navigationProperty.Name); // For Atom, we always manually write out the links for the navigation properties off of the entity type // Or if the navigation is expanded, we manually write out the links for the navigation properties along with the expanded entries if (writer.GetType().Name != "ODataJsonLightWriter" || expandedNavigationItem != null) { bool isCollection = navigationProperty.Type.IsCollection(); var navigationLink = new ODataNavigationLink { IsCollection = isCollection, Name = navigationProperty.Name, }; if (writer.GetType().Name == "ODataAtomWriter") { //If the passed in parentEntryUri is null then exception will be thrown, to avoid this, create a relative 'potato' Uri. navigationLink.Url = (parentEntryUri == null) ? new Uri("potato", UriKind.Relative) : new Uri(new Uri(parentEntryUri.AbsoluteUri + "/"), navigationProperty.Name); } writer.WriteStart(navigationLink); if (expandedNavigationItem != null) { ExpandSelectItemHandler expandItemHandler = new ExpandSelectItemHandler(element); expandedNavigationItem.HandleWith(expandItemHandler); var propertyValue = expandItemHandler.ExpandedChildElement; if (propertyValue != null) { IEdmNavigationSource targetSource = edmParent.FindNavigationTarget(navigationProperty); if (isCollection) { long?count = null; var collectionValue = propertyValue as IEnumerable; if (collectionValue != null && expandedNavigationItem.CountOption == true) { count = collectionValue.Cast <object>().LongCount(); } WriteFeed(writer, collectionValue, targetSource as IEdmEntitySetBase, targetVersion, expandedNavigationItem.SelectAndExpand, count, null, null); } else { WriteEntry(writer, propertyValue, targetSource, targetVersion, expandedNavigationItem.SelectAndExpand); } } } writer.WriteEnd(); } } }
private static void WriteNavigationLinks(ODataWriter writer, object element, Uri parentEntryUri, IEdmNavigationSource edmParent, ODataVersion targetVersion, IEnumerable<SelectItem> expandedItems) { foreach (var navigationProperty in ((IEdmEntityType)EdmClrTypeUtils.GetEdmType(DataSourceManager.GetCurrentDataSource().Model, element)).NavigationProperties()) { // give proprity to ExpandedReferenceSelectItem var expandedItem = GetExpandedReferenceItem(expandedItems, navigationProperty.Name); if (expandedItem == null) { expandedItem = GetExpandedNavigationItem(expandedItems, navigationProperty.Name); } // For Atom, we always manually write out the links for the navigation properties off of the entity type // Or if the navigation is expanded, we manually write out the links for the navigation properties along with the expanded entries if (writer.GetType().Name != "ODataJsonLightWriter" || expandedItem != null) { bool isCollection = navigationProperty.Type.IsCollection(); var navigationLink = new ODataNavigationLink { IsCollection = isCollection, Name = navigationProperty.Name, }; if (writer.GetType().Name == "ODataAtomWriter") { //If the passed in parentEntryUri is null then exception will be thrown, to avoid this, create a relative 'potato' Uri. navigationLink.Url = (parentEntryUri == null) ? new Uri("potato", UriKind.Relative) : new Uri(new Uri(parentEntryUri.AbsoluteUri + "/"), navigationProperty.Name); } writer.WriteStart(navigationLink); if (expandedItem != null) { ExpandSelectItemHandler expandItemHandler = new ExpandSelectItemHandler(element); expandedItem.HandleWith(expandItemHandler); var propertyValue = expandItemHandler.ExpandedChildElement; if (propertyValue != null) { IEdmNavigationSource targetSource = edmParent.FindNavigationTarget(navigationProperty); if (isCollection) { long? count = null; var collectionValue = propertyValue as IEnumerable; if (collectionValue != null && expandedItem.CountOption == true) { count = collectionValue.Cast<object>().LongCount(); } if (expandedItem.GetType() == typeof(ExpandedReferenceSelectItem)) { WriteReferenceLinks(writer, collectionValue, targetSource as IEdmEntitySetBase, targetVersion, navigationLink); } else { WriteFeed(writer, collectionValue, targetSource as IEdmEntitySetBase, targetVersion, ((ExpandedNavigationSelectItem)expandedItem).SelectAndExpand, count, null, null); } } else { if (expandedItem.GetType() == typeof(ExpandedReferenceSelectItem)) { WriteReferenceLink(writer, propertyValue, targetSource, targetVersion, navigationLink); } else { WriteEntry(writer, propertyValue, targetSource, targetVersion, ((ExpandedNavigationSelectItem)expandedItem).SelectAndExpand); } } } } writer.WriteEnd(); } } }