public MongoDbEntityModifedAllEvent(ICommandRepository commandRepository, ISpecificationQueryStrategy <TEntity> specificationStrategy, IEnumerable <MongoUpdateItem <TEntity> > mongoUpdateItems, WriteConcern writeConcern)
     : base(commandRepository, null)
 {
     MongoUpdateItems      = mongoUpdateItems;
     SpecificationStrategy = specificationStrategy;
     WriteConcern          = writeConcern;
 }
 public MongoDbEntityModifedAllEvent(ICommandRepository commandRepository, ISpecificationQueryStrategy <TEntity> specificationStrategy, IMongoUpdate mongoUpdate, WriteConcern writeConcern)
     : base(commandRepository, null)
 {
     MongoUpdate           = mongoUpdate;
     SpecificationStrategy = specificationStrategy;
     WriteConcern          = writeConcern;
 }
        /// <summary>
        /// Applies a criteria that is used for matching entities against and combine it with the current specified predicate using the logical "and".
        /// </summary>
        /// <param name="predicate">A function to filter each entity.</param>
        /// <returns>The current instance.</returns>
        public QueryOptions <T> SatisfyBy([NotNull] Expression <Func <T, bool> > predicate)
        {
            Guard.NotNull(predicate, nameof(predicate));

            predicate = _specificationStrategy != null?_specificationStrategy.Predicate.And(predicate) : predicate;

            _specificationStrategy = new SpecificationQueryStrategy <T>(predicate);

            return(this);
        }
        /// <summary>
        /// Includes a specification strategy/criteria that is used for matching entities against and combine it with the current specified predicate using the logical "and".
        /// </summary>
        /// <param name="criteria">The specification criteria that is used for matching entities against.</param>
        /// <returns>The current instance.</returns>
        public QueryOptions <T> Include([NotNull] ISpecificationQueryStrategy <T> criteria)
        {
            Guard.NotNull(criteria, nameof(criteria));

            var predicate = _specificationStrategy != null?_specificationStrategy.Predicate.And(criteria.Predicate) : criteria.Predicate;

            _specificationStrategy = new SpecificationQueryStrategy <T>(predicate);

            return(this);
        }
        public WriteConcernResult ModifyAll <TEntity>(
            ICommandRepository commandRepository,
            ISpecificationQueryStrategy <TEntity> specificationStrategy,
            WriteConcern writeConcern,
            params MongoUpdateItem <TEntity>[] updateItems) where TEntity : class
        {
            if (writeConcern == null)
            {
                throw new ArgumentNullException("writeConcern", "writeConcern is null.");
            }

            if (specificationStrategy == null)
            {
                throw new ArgumentNullException("predicate", "predicate is null.");
            }

            if (updateItems == null)
            {
                throw new ArgumentNullException("mongoUpdate", "mongoUpdate is null.");
            }

            var mongoDatabase = commandRepository.ObjectContext as MongoDatabase;

            if (mongoDatabase == null)
            {
                throw new NotSupportedException("Load can only be used with a DbContext");
            }

            var updateBuilder = new UpdateBuilder();

            foreach (var item in updateItems)
            {
                var value = BsonTypeMapper.MapToBsonValue(item.Value);
                updateBuilder.Set(item.Key, value);
            }

            var collection = mongoDatabase.GetCollection <TEntity>(typeof(TEntity).FullName);
            var query      = collection.AsQueryable().AddQueryStrategy(specificationStrategy);
            var mongoQuery = ((MongoQueryable <TEntity>)query).GetMongoQuery();

            var result = collection.Update(mongoQuery, updateBuilder, UpdateFlags.Multi, writeConcern);

            var modifyAllEvent = new MongoDbEntityModifedAllEvent <TEntity>(commandRepository, specificationStrategy, updateBuilder, writeConcern);

            commandRepository.RaiseEvent(modifyAllEvent);

            return(result);
        }
        public WriteConcernResult ModifyAll <TEntity>(
            ICommandRepository commandRepository,
            ISpecificationQueryStrategy <TEntity> specificationStrategy,
            WriteConcern writeConcern,
            IMongoUpdate mongoUpdate) where TEntity : class
        {
            if (writeConcern == null)
            {
                throw new ArgumentNullException("writeConcern", "writeConcern is null.");
            }

            if (specificationStrategy == null)
            {
                throw new ArgumentNullException("predicate", "predicate is null.");
            }

            if (mongoUpdate == null)
            {
                throw new ArgumentNullException("mongoUpdate", "mongoUpdate is null.");
            }

            var mongoDatabase = commandRepository.ObjectContext as MongoDatabase;

            if (mongoDatabase == null)
            {
                throw new NotSupportedException("ModifyAll can only be used with a MongoDatabase context");
            }

            var collection = mongoDatabase.GetCollection <TEntity>(typeof(TEntity).FullName);
            var query      = collection.AsQueryable().AddQueryStrategy(specificationStrategy);
            var mongoQuery = ((MongoQueryable <TEntity>)query).GetMongoQuery();

            // Call Mongo
            var result = collection.Update(mongoQuery, mongoUpdate, UpdateFlags.Multi, writeConcern);

            var modifyAllEvent = new MongoDbEntityModifedAllEvent <TEntity>(commandRepository, specificationStrategy, mongoUpdate, writeConcern);

            commandRepository.RaiseEvent(modifyAllEvent);

            return(result);
        }
 public static IQueryStrategy AsQueryStrategy <T>(this ISpecificationQueryStrategy <T> specification)
 {
     return((IQueryStrategy)specification);
 }
 public static WriteConcernResult ModifyAll <TEntity>(this IRepository commandRepository, ISpecificationQueryStrategy <TEntity> specificationStrategy, IMongoUpdate mongoUpdate) where TEntity : class
 {
     return(_DefaultImplementation.ModifyAll <TEntity>(commandRepository, specificationStrategy, new WriteConcern(), mongoUpdate));
 }
 public static WriteConcernResult ModifyAll <TEntity>(this IRepository commandRepository, ISpecificationQueryStrategy <TEntity> specificationStrategy, WriteConcern writeConcern, params MongoUpdateItem <TEntity>[] updateItems) where TEntity : class
 {
     return(_DefaultImplementation.ModifyAll <TEntity>(commandRepository, specificationStrategy, writeConcern, updateItems));
 }