Пример #1
0
 /// <summary>
 /// Find the related instance.
 /// </summary>
 /// <param name="deltaItem"></param>
 /// <param name="originalSet"></param>
 /// <returns></returns>
 protected virtual T GetOriginal(IDeltaItem deltaItem, IEnumerable <T> originalSet)
 {
     return(null);
 }
        /// <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);

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

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