/// <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); } }