Пример #1
0
        async Task <IQueryableCollection <TResult> > IDatabaseContext.LoadAsync <TSource, TResult>(TSource entity, Expression <Func <TSource, ICollection <TResult> > > expression)
        {
            if (entity == null)
            {
                throw new ArgumentNullException(nameof(entity));
            }
            if (expression == null)
            {
                throw new ArgumentNullException(nameof(expression));
            }
            string propertyName = GetPropertyName(expression);
            var    entry        = InnerContext.Entry((object)entity);
            var    reference    = entry.Collection(propertyName);
            var    property     = entry.Metadata.FindNavigation(propertyName);
            var    context      = this.GetWrappedContext <TResult>();

            if (entry.State == EntityState.Detached)
            {
                entry.State = EntityState.Unchanged;
            }
            var queryable = (IQueryable <TResult>)reference.Query();
            var count     = await queryable.CountAsync();

            return(new ComBoostEntityCollection <TResult>(entry, context, property, queryable, count));
        }
Пример #2
0
        async Task <TResult> IDatabaseContext.LoadAsync <TSource, TResult>(TSource entity, Expression <Func <TSource, TResult> > expression)
        {
            if (entity == null)
            {
                throw new ArgumentNullException(nameof(entity));
            }
            if (expression == null)
            {
                throw new ArgumentNullException(nameof(expression));
            }
            string propertyName = GetPropertyName(expression);
            var    entry        = InnerContext.Entry((object)entity);
            var    reference    = entry.Reference(propertyName);

            if (!reference.IsLoaded)
            {
                if (entry.State == EntityState.Detached)
                {
                    entry.State = EntityState.Unchanged;
                }
                await reference.LoadAsync();
            }
            TResult result = expression.Compile()(entity);

            return(result);
        }
Пример #3
0
        async Task <TResult> IDatabaseContext.LoadAsync <TSource, TResult>(TSource entity, Expression <Func <TSource, TResult> > expression)
        {
            if (entity == null)
            {
                throw new ArgumentNullException(nameof(entity));
            }
            if (expression == null)
            {
                throw new ArgumentNullException(nameof(expression));
            }
            string propertyName = GetPropertyName(expression);
            var    entry        = InnerContext.ChangeTracker.Entries <TSource>().FirstOrDefault(t => t.Entity.Index.Equals(entity.Index));

            if (entry != null && entry.Entity != entity)
            {
                entry.CurrentValues.SetValues(entity);
            }
            else
            {
                entry = InnerContext.Entry(entity);
            }
            var reference = entry.Reference(propertyName);

            if (!reference.IsLoaded)
            {
                if (entry.State == EntityState.Detached)
                {
                    entry.State = EntityState.Unchanged;
                }
                await reference.LoadAsync();
            }
            return((TResult)reference.CurrentValue);
        }
Пример #4
0
        Task <TResult> IDatabaseContext.LoadAsync <TSource, TResult>(TSource entity, Expression <Func <TSource, TResult> > expression)
        {
            if (entity == null)
            {
                throw new ArgumentNullException(nameof(entity));
            }
            if (expression == null)
            {
                throw new ArgumentNullException(nameof(expression));
            }
            TResult result = expression.Compile()(entity);

            if (result != null)
            {
                return(Task.FromResult(result));
            }
            string propertyName   = GetPropertyName(expression);
            var    entry          = InnerContext.Entry((object)entity);
            var    property       = entry.Metadata.FindNavigation(propertyName).ForeignKey.Properties[0];
            var    infrastructure = entry.GetInfrastructure();
            var    key            = infrastructure.GetCurrentValue(property);

            if (key == null)
            {
                return(null);
            }
            var context = this.GetWrappedContext <TResult>();

            return(context.GetAsync(key));
        }
Пример #5
0
        async Task <TResult> IDatabaseContext.LoadAsync <TSource, TResult>(TSource entity, Expression <Func <TSource, TResult> > expression)
        {
            if (entity == null)
            {
                throw new ArgumentNullException(nameof(entity));
            }
            if (expression == null)
            {
                throw new ArgumentNullException(nameof(expression));
            }
            //TResult result = expression.Compile()(entity);
            //if (result != null)
            //    return result;
            string propertyName = GetPropertyName(expression);
            var    entry        = InnerContext.Entry((object)entity);
            var    property     = entry.Reference(propertyName);

            if (property.IsLoaded)
            {
                return((TResult)property.CurrentValue);
            }
            //var infrastructure = entry.GetInfrastructure();
            await property.LoadAsync();

            return((TResult)property.CurrentValue);
        }
Пример #6
0
        public IQueryable <T> Include <TProperty>(IQueryable <T> query, Expression <Func <T, TProperty> > expression)
        {
            ExpressionWrapper <T, M> wrapper       = new ExpressionWrapper <T, M>();
            LambdaExpression         newExpression = (LambdaExpression)wrapper.Visit(expression);
            var propertyType = newExpression.Type.GetGenericArguments()[1];
            var queryable    = query.Unwrap <T, M>();

            queryable = (IQueryable <M>)InnerContext.GetType().GetMethod("Include").MakeGenericMethod(propertyType).Invoke(InnerContext, new object[] { queryable, newExpression });
            return(queryable.Wrap <T, M>());
        }
Пример #7
0
        public virtual void SaveChanges()
        {
            if (_saveCalled || _rollBackCalled)
            {
                throw new InvalidOperationException("This Unit-Of-Work has been already completed.");
            }

            _saveCalled = true;
            InnerContext.SaveChanges(); // TODO: add asynchronous operations as part of the exercise ;-)
        }
Пример #8
0
        public override TiffPixelBufferWriter <TPixel> GetWriter <TPixel>()
        {
            TiffPixelBufferWriter <TPixel> writer = InnerContext.GetWriter <TPixel>();

            if (_isFlipOrOrientation)
            {
                return(new TiffOrientedPixelBufferWriter <TPixel>(writer, _flipLeftRigt, _flipTopBottom).AsPixelBufferWriter());
            }
            return(new TiffFlippedPixelBufferWriter <TPixel>(writer, _flipLeftRigt, _flipTopBottom).AsPixelBufferWriter());
        }
Пример #9
0
 /// <summary>
 /// Gets whether a given Variable exists in this Context.
 /// </summary>
 /// <param name="var">Variable Node.</param>
 /// <returns></returns>
 public bool IsVariable(INode var)
 {
     if (InnerContext == null)
     {
         return(_vars.Contains(var));
     }
     else
     {
         return(_vars.Contains(var) || InnerContext.IsVariable(var));
     }
 }
Пример #10
0
        public IEntityContext <T> GetContext <T>() where T : class, IEntity, new()
        {
            if (_CachedEntityContext.ContainsKey(typeof(T)))
            {
                return((EntityContext <T>)_CachedEntityContext[typeof(T)]);
            }
            var context = new EntityContext <T>(this, InnerContext.Set <T>());

            _CachedEntityContext.Add(typeof(T), context);
            return(context);
        }
        static List <Action> CreateCountingActions()
        {
            List <Action> actions      = new List <Action>();
            OuterContext  outerContext = new OuterContext();

            outerContext.outerCounter = 0;
            for (int i = 0; i < 2; i++)
            {
                InnerContext innerContext = new InnerContext();
                innerContext.outerContext = outerContext;
                innerContext.innerCounter = 0;
                Action action = innerContext.Method;
                actions.Add(action);
            }
            return(actions);
        }
Пример #12
0
        async Task <IQueryableCollection <TResult> > IDatabaseContext.LoadAsync <TSource, TResult>(TSource entity, Expression <Func <TSource, ICollection <TResult> > > expression)
        {
            if (entity == null)
            {
                throw new ArgumentNullException(nameof(entity));
            }
            if (expression == null)
            {
                throw new ArgumentNullException(nameof(expression));
            }
            string propertyName            = GetPropertyName(expression);
            var    entry                   = InnerContext.Entry((object)entity);
            var    property                = entry.Collection(propertyName);
            IQueryable <TResult> queryable = (IQueryable <TResult>)property.Query();
            var context = this.GetWrappedContext <TResult>();
            var count   = await context.CountAsync(queryable);

            return(new ComBoostEntityCollection <TResult>(entry, context, property, queryable, count));
        }
Пример #13
0
        async Task <TResult> IDatabaseContext.LoadAsync <TSource, TResult>(TSource entity, Expression <Func <TSource, TResult> > expression)
        {
            if (entity == null)
            {
                throw new ArgumentNullException(nameof(entity));
            }
            if (expression == null)
            {
                throw new ArgumentNullException(nameof(expression));
            }
            string propertyName = GetPropertyName(expression);
            var    entry        = InnerContext.Entry((object)entity);
            var    property     = entry.Reference(propertyName);

            if (!property.IsLoaded)
            {
                await property.LoadAsync();
            }
            return((TResult)property.CurrentValue);
        }
Пример #14
0
        async Task <IQueryableCollection <TResult> > IDatabaseContext.LoadAsync <TSource, TResult>(TSource entity, Expression <Func <TSource, ICollection <TResult> > > expression)
        {
            if (entity == null)
            {
                throw new ArgumentNullException(nameof(entity));
            }
            if (expression == null)
            {
                throw new ArgumentNullException(nameof(expression));
            }
            string     propertyName        = GetPropertyName(expression);
            var        entry               = InnerContext.Entry((object)entity);
            var        property            = entry.Metadata.FindNavigation(propertyName);
            var        inverseProperty     = property.FindInverse();
            var        parameterExpression = Expression.Parameter(typeof(TResult));
            Expression propertyExpression  = Expression.Property(parameterExpression, inverseProperty.Name);

            if (inverseProperty.IsCollection())
            {
                var whereP  = Expression.Parameter(typeof(TSource));
                var equalE  = Expression.Equal(Expression.Property(whereP, "Index"), Expression.Constant(entity.Index));
                var lambdaE = Expression.Lambda <Func <TSource, bool> >(equalE, whereP);
                propertyExpression = Expression.Call(typeof(Queryable).GetMethod("Any", new Type[] { typeof(IQueryable <TSource>), typeof(Expression <Func <TSource, bool> >) }), propertyExpression, lambdaE);
            }
            else
            {
                propertyExpression = Expression.Property(propertyExpression, "Index");
            }
            var equalExpression  = Expression.Equal(propertyExpression, Expression.Constant(entity.Index));
            var lambdaExpression = Expression.Lambda <Func <TResult, bool> >(equalExpression, parameterExpression);

            //entry.GetInfrastructure().AddToCollectionSnapshot()

            var context   = this.GetWrappedContext <TResult>();
            var queryable = context.Query().Where(lambdaExpression);
            var count     = await context.CountAsync(queryable);

            return(new ComBoostEntityCollection <TResult>(entry, context, property, queryable, count));
        }
Пример #15
0
        async Task <IQueryableCollection <TResult> > IDatabaseContext.LoadAsync <TSource, TResult>(TSource entity, Expression <Func <TSource, ICollection <TResult> > > expression)
        {
            if (entity == null)
            {
                throw new ArgumentNullException(nameof(entity));
            }
            if (expression == null)
            {
                throw new ArgumentNullException(nameof(expression));
            }
            string propertyName = GetPropertyName(expression);
            var    entry        = InnerContext.ChangeTracker.Entries <TSource>().FirstOrDefault(t => t.Entity.Index.Equals(entity.Index));

            if (entry != null && entry.Entity != entity)
            {
                entry.CurrentValues.SetValues(entity);
            }
            else
            {
                entry = InnerContext.Entry(entity);
            }
            var reference = entry.Collection(propertyName);
            var property  = entry.Metadata.FindNavigation(propertyName);
            var context   = this.GetWrappedContext <TResult>();

            if (entry.State == EntityState.Detached)
            {
                entry.State = EntityState.Unchanged;
            }
            var queryable = (IQueryable <TResult>)reference.Query();
            var count     = await queryable.CountAsync();

            if (!TrackEntity)
            {
                queryable = queryable.AsNoTracking();
            }
            return(new ComBoostEntityCollection <TResult>(entry, context, property, queryable, count));
        }
Пример #16
0
 public async Task <T> GetAsync(object key)
 {
     return((M)await InnerContext.GetAsync(key));
 }
Пример #17
0
 public Task <int> SaveAsync()
 {
     return(InnerContext.SaveChangesAsync());
 }
Пример #18
0
 public Task ReloadAsync(T item)
 {
     return(InnerContext.ReloadAsync((M)item));
 }
Пример #19
0
 public void Add(T item)
 {
     InnerContext.Add((M)item);
 }
 public override TiffPixelBufferWriter <TPixel> GetWriter <TPixel>()
 {
     return(InnerContext.GetWriter <TPixel>().Crop(CropOffset, ReadSize));
 }
Пример #21
0
 public void RemoveRange(IEnumerable <T> items)
 {
     InnerContext.RemoveRange(items.Cast <M>());
 }
Пример #22
0
 public Task <int> CountAsync(IQueryable <T> query)
 {
     return(InnerContext.CountAsync(query.Unwrap <T, M>()));
 }
Пример #23
0
 public T Create()
 {
     return(InnerContext.Create());
 }
Пример #24
0
 public async Task <T> FirstAsync(IQueryable <T> query)
 {
     return(await InnerContext.FirstAsync(query.Unwrap <T, M>()));
 }
Пример #25
0
 public async Task <List <T> > ToListAsync(IQueryable <T> query)
 {
     return((await InnerContext.ToListAsync(query.Unwrap <T, M>())).Cast <T>().ToList());
 }
Пример #26
0
 public IQueryable <T> Query()
 {
     return(InnerContext.Query().Wrap <T, M>());
 }
Пример #27
0
 public async Task <T> SingleOrDefaultAsync(IQueryable <T> query)
 {
     return(await InnerContext.SingleOrDefaultAsync(query.Unwrap <T, M>()));
 }
Пример #28
0
 public void AddRange(IEnumerable <T> items)
 {
     InnerContext.AddRange(items.Cast <M>());
 }
Пример #29
0
 public async Task <T[]> ToArrayAsync(IQueryable <T> query)
 {
     return((await InnerContext.ToArrayAsync(query.Unwrap <T, M>())).Cast <T>().ToArray());
 }
Пример #30
0
 public void Remove(T item)
 {
     InnerContext.Remove((M)item);
 }