Exemplo n.º 1
0
        private BulkWriteResult <TDocument> ExecuteHelper(IClientSessionHandle session, WriteConcern writeConcern)
        {
            if (_hasBeenExecuted)
            {
                throw new InvalidOperationException("The bulk write operation has already been executed.");
            }
            _hasBeenExecuted = true;

            var collectionSettings     = _collection.Settings;
            var messageEncoderSettings = _collection.GetMessageEncoderSettings();

            IEnumerable <WriteRequest> requests = _requests;

            if (_collection.Settings.AssignIdOnInsert)
            {
                requests = _requests.Select(x =>
                {
                    var insertRequest = x as InsertRequest;
                    if (insertRequest != null)
                    {
                        object document            = insertRequest.Document;
                        IBsonSerializer serializer = BsonDocumentSerializer.Instance;
                        var wrapped = insertRequest.Document as BsonDocumentWrapper;
                        while (wrapped != null)
                        {
                            document   = wrapped.Wrapped;
                            serializer = wrapped.Serializer;
                            wrapped    = document as BsonDocumentWrapper;
                        }

                        _collection.AssignId(document, serializer);
                    }

                    return(x);
                });
            }

            var operation = new BulkMixedWriteOperation(new CollectionNamespace(_collection.Database.Name, _collection.Name), requests, messageEncoderSettings)
            {
                BypassDocumentValidation = _bypassDocumentValidation,
                IsOrdered      = _isOrdered,
                RetryRequested = _collection.Database.Server.Settings.RetryWrites,
                WriteConcern   = writeConcern
            };

            try
            {
                var result = _collection.ExecuteWriteOperation(session, operation);
                return(BulkWriteResult <TDocument> .FromCore(result));
            }
            catch (MongoBulkWriteOperationException ex)
            {
                throw MongoBulkWriteException <TDocument> .FromCore(ex);
            }
        }