Exemple #1
0
        /// <summary>
        /// Find the related instance.
        /// </summary>
        /// <param name="deltaItem">The delta item.</param>
        /// <param name="originalSet">The original set.</param>
        /// <returns></returns>
        protected T GetOriginal(IDeltaSetItem deltaItem, IEnumerable originalSet)
        {
            if (deltaItem == null)
            {
                throw Error.ArgumentNull(nameof(deltaItem));
            }

            if (originalSet == null)
            {
                throw Error.ArgumentNull(nameof(originalSet));
            }

            return(null);
        }
        internal DeltaItemKind GetDelteItemKind(object item)
        {
            IEdmChangedObject edmChangedObject = item as IEdmChangedObject;

            if (edmChangedObject != null)
            {
                return(edmChangedObject.DeltaKind);
            }

            IDeltaSetItem deltaSetItem = item as IDeltaSetItem;

            if (deltaSetItem != null)
            {
                return(deltaSetItem.Kind);
            }

            throw new SerializationException(Error.Format(
                                                 SRResources.CannotWriteType, GetType().Name, item.GetType().FullName));
        }
        /// <inheritdoc />
        public sealed override object ReadInline(object item, IEdmTypeReference edmType, ODataDeserializerContext readContext)
        {
            if (item == null)
            {
                return(null);
            }

            if (edmType == null)
            {
                throw Error.ArgumentNull(nameof(edmType));
            }

            if (readContext == null)
            {
                throw Error.ArgumentNull(nameof(readContext));
            }

            if (!edmType.IsCollection() || !edmType.AsCollection().ElementType().IsStructured())
            {
                throw Error.Argument(nameof(edmType), SRResources.TypeMustBeResourceSet, edmType.ToTraceString());
            }

            ODataDeltaResourceSetWrapper resourceSet = item as ODataDeltaResourceSetWrapper;

            if (resourceSet == null)
            {
                throw Error.Argument(nameof(item), SRResources.ArgumentMustBeOfType, typeof(ODataDeltaResourceSetWrapper).Name);
            }

            // Recursion guard to avoid stack overflows
            RuntimeHelpers.EnsureSufficientExecutionStack();

            IEdmStructuredTypeReference elementType = edmType.AsCollection().ElementType().AsStructured();

            IEnumerable result = ReadDeltaResourceSet(resourceSet, elementType, readContext);

            if (result != null)
            {
                if (readContext.IsNoClrType)
                {
                    EdmChangedObjectCollection changedObjCollection = new EdmChangedObjectCollection(elementType.Definition as IEdmEntityType);
                    foreach (IEdmChangedObject changedObject in result)
                    {
                        changedObjCollection.Add(changedObject);
                    }

                    return(changedObjCollection);
                }
                else
                {
                    Type elementClrType     = readContext.Model.GetClrType(elementType);
                    Type changedObjCollType = typeof(DeltaSet <>).MakeGenericType(elementClrType);

                    IDeltaSet deltaSet = Activator.CreateInstance(changedObjCollType) as IDeltaSet;
                    foreach (var delta in result)
                    {
                        IDeltaSetItem deltaItem = delta as IDeltaSetItem;
                        if (deltaItem != null)
                        {
                            deltaSet.Add(deltaItem);
                        }
                    }

                    return(deltaSet);
                }
            }
            else
            {
                return(result);
            }
        }