示例#1
0
 public static Task <T> GetAsync <T>(this IMongoCollection <T> collection, Expression <Func <T, bool> > filter, UpdateDefinition <T> factory)
     where T : Entity
 => collection.FindOneAndUpdateAsync(filter, factory.SetOnInsert(x => x.Timestamp, DateTimeOffset.UtcNow),
                                     new FindOneAndUpdateOptions <T, T>
 {
     IsUpsert       = true,
     ReturnDocument = ReturnDocument.After
 });
        protected virtual UpdateDefinition <T> ToUpdateDefinition(Updates <T> updates)
        {
            UpdateDefinition <T> updateDefinition = Builders <T> .Update.Combine();

            if (updates.Sets != null)
            {
                foreach (Update <T> update in updates.Sets)
                {
                    updateDefinition = updateDefinition.Set(update.PropertyExpression, update.Value);
                }
            }
            if (updates.Increments != null)
            {
                foreach (Update <T> update in updates.Increments)
                {
                    updateDefinition = updateDefinition.Inc(update.PropertyExpression, update.Value);
                }
            }
            if (updates.SetOnInserts != null)
            {
                foreach (Update <T> update in updates.SetOnInserts)
                {
                    updateDefinition = updateDefinition.SetOnInsert(update.PropertyExpression, update.Value);
                }
            }
            if (updates.Pushes != null)
            {
                foreach (UpdateCollection <T> update in updates.Pushes)
                {
                    var property = new ExpressionFieldDefinition <T>(update.PropertyExpression);
                    updateDefinition = updateDefinition.Push(property, update.Value);
                }
            }
            if (updates.Pulls != null)
            {
                foreach (UpdateCollection <T> update in updates.Pulls)
                {
                    var property = new ExpressionFieldDefinition <T>(update.PropertyExpression);
                    updateDefinition = updateDefinition.Pull(property, update.Value);
                }
            }

            return(updateDefinition);
        }
        public static UpdateDefinition <TDocument> SetOnInsertAllMappedMembers <TDocument>(
            this UpdateDefinition <TDocument> update, TDocument item
            , params Expression <Func <TDocument, object> >[] excludeMembers)
        {
            excludeMembers = excludeMembers ?? new Expression <Func <TDocument, object> > [0];
            List <string> excludeMemberNames = excludeMembers.Select(p => GetMemberName(p)).ToList();

            Type itemType = typeof(TDocument);
            List <PropertyInfo> mappedMembers = GetMappedMembers(itemType);

            foreach (PropertyInfo prop in mappedMembers)
            {
                if (excludeMemberNames.Contains(prop.Name))
                {
                    continue;
                }

                object value = prop.GetValue(item);
                update = update.SetOnInsert(prop.Name, value);
            }

            return(update);
        }
示例#4
0
 public bool Upsert(FilterDefinition <T> filter, UpdateDefinition <T> update)
 {
     return(Update(filter, update.SetOnInsert(i => i.CreatedOn, DateTime.Now), updateOptions: new UpdateOptions {
         IsUpsert = true
     }));
 }