Exemple #1
0
        public override Task <ICollection> GetOrphansAsync(object snapshot, string entityName, CancellationToken cancellationToken)
        {
            if (cancellationToken.IsCancellationRequested)
            {
                return(Task.FromCanceled <ICollection>(cancellationToken));
            }
            try
            {
                var sn = new SetSnapShot <T>((IEnumerable <T>)snapshot);

                // TODO: Avoid duplicating shortcuts and array copy, by making base class GetOrphans() more flexible
                if (WrappedSet.Count == 0)
                {
                    return(Task.FromResult <ICollection>(sn));
                }
                if (((ICollection)sn).Count == 0)
                {
                    return(Task.FromResult <ICollection>(sn));
                }
                return(GetOrphansAsync(sn, WrappedSet.ToArray(), entityName, Session, cancellationToken));
            }
            catch (Exception ex)
            {
                return(Task.FromException <ICollection>(ex));
            }
        }
 public void Transforms()
 {
     var fixture = XElement.Parse(@"<z><p></p><p></p><q><h></h></q><q><h></h></q></z>");
     var element = new XElementAdapter(fixture);
     var set = new WrappedSet(element);
     new ExampleTransformation().Transform(set);
     Assert.AreEqual("B", set.First("p").Attr("x"));
     Assert.AreEqual("WrappedSet(<z><p x=\"B\">A</p><p x=\"B\">A</p><q><h>1</h></q><q><h>2</h></q><q><h>C</h></q></z>)", set.ToString());
 }
        /// <summary>
        /// Initializes this PersistentSet from the cached values.
        /// </summary>
        /// <param name="persister">The CollectionPersister to use to reassemble the PersistentSet.</param>
        /// <param name="disassembled">The disassembled PersistentSet.</param>
        /// <param name="owner">The owner object.</param>
        /// <param name="cancellationToken">A cancellation token that can be used to cancel the work</param>
        public override async Task InitializeFromCacheAsync(ICollectionPersister persister, object disassembled, object owner, CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();
            var array = (object[])disassembled;
            int size  = array.Length;

            BeforeInitialize(persister, size);
            for (int i = 0; i < size; i++)
            {
                var element = await(persister.ElementType.AssembleAsync(array[i], Session, owner, cancellationToken)).ConfigureAwait(false);
                if (element != null)
                {
                    WrappedSet.Add((T)element);
                }
            }
            SetInitialized();
        }
        public override async Task <IEnumerable> GetDeletesAsync(ICollectionPersister persister, bool indexIsFormula, CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();
            IType elementType = persister.ElementType;
            var   sn          = (SetSnapShot <T>)GetSnapshot();
            var   deletes     = new List <T>(((ICollection <T>)sn).Count);

            deletes.AddRange(sn.Where(obj => !WrappedSet.Contains(obj)));

            foreach (var obj in WrappedSet)
            {
                T oldValue;
                if (sn.TryGetValue(obj, out oldValue) && await(elementType.IsDirtyAsync(obj, oldValue, Session, cancellationToken)).ConfigureAwait(false))
                {
                    deletes.Add(oldValue);
                }
            }

            return(deletes);
        }
 IQueryable GetQueryable()
 {
     return(queryable ?? (queryable = WasInitialized ? WrappedSet.AsQueryable() : this.Query(Session)));
 }