/// <summary>
        /// Deserializes the given <paramref name="deletedLink"/> under the given <paramref name="readContext"/>.
        /// </summary>
        /// <param name="deletedLink">The given deleted link.</param>
        /// <param name="elementType">The element type.</param>
        /// <param name="readContext">The deserializer context.</param>
        /// <returns>The created object.</returns>
        public virtual object ReadDeltaDeletedLink(ODataDeltaDeletedLinkWrapper deletedLink, IEdmStructuredTypeReference elementType, ODataDeserializerContext readContext)
        {
            if (deletedLink == null)
            {
                throw Error.ArgumentNull(nameof(deletedLink));
            }

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

            if (readContext.IsNoClrType)
            {
                EdmDeltaDeletedLink edmDeltaLink = new EdmDeltaDeletedLink(elementType?.Definition as IEdmEntityType);
                edmDeltaLink.Source       = deletedLink.DeltaDeletedLink.Source;
                edmDeltaLink.Target       = deletedLink.DeltaDeletedLink.Target;
                edmDeltaLink.Relationship = deletedLink.DeltaDeletedLink.Relationship;
                return(edmDeltaLink);
            }
            else
            {
                // refactor how to get the CLR type
                Type elementClrType = readContext.Model.GetClrType(elementType);

                Type deltaLinkType          = typeof(DeltaDeletedLink <>).MakeGenericType(elementClrType);
                IDeltaDeletedLink deltaLink = Activator.CreateInstance(deltaLinkType) as IDeltaDeletedLink;

                deltaLink.Source       = deletedLink.DeltaDeletedLink.Source;
                deltaLink.Target       = deletedLink.DeltaDeletedLink.Target;
                deltaLink.Relationship = deletedLink.DeltaDeletedLink.Relationship;
                return(deltaLink);
            }
        }
        /// <summary>
        ///  Overwrites the <paramref name="originalSet"/> entity with the changes tracked by this Delta resource set.
        /// </summary>
        /// <param name="originalSet">The original set.</param>
        public virtual void Patch(IEnumerable <T> originalSet)
        {
            if (originalSet == null)
            {
                throw Error.ArgumentNull(nameof(originalSet));
            }

            // TODO: work out the patch process
            foreach (IDeltaItem delta in this)
            {
                T originalObj = GetOriginal(delta, originalSet);

                switch (delta.Kind)
                {
                case DeltaKind.DeltaResource:
                    // A Delta resource is a delta
                    IDelta deltaResource = (IDelta)delta;
                    break;

                case DeltaKind.DeltaDeletedResource:
                    // A Delta deleted resource is a delta deleted resource
                    IDeltaDeletedResource deltaDeletedResource = (IDeltaDeletedResource)delta;
                    break;

                case DeltaKind.DeltaDeletedLink:
                    IDeltaDeletedLink deltaDeletedLink = (IDeltaDeletedLink)delta;
                    break;

                case DeltaKind.DeltaLink:
                    IDeltaLink deltaLink = (IDeltaLink)delta;
                    break;

                case DeltaKind.Unknown:
                default:
                    //throw Error.InvalidOperation(SRResources.CannotSetDynamicPropertyDictionary, propertyInfo.Name,
                    //    entity.GetType().FullName);
                    throw Error.InvalidOperation("Unknow delta kind");
                }
            }
        }