19
19
using System . Linq ;
20
20
using MongoDB . Bson ;
21
21
using MongoDB . Bson . Serialization ;
22
+ using MongoDB . Bson . Serialization . Serializers ;
22
23
using MongoDB . Driver . Builders ;
23
24
24
25
namespace MongoDB . Driver
@@ -30,10 +31,11 @@ namespace MongoDB.Driver
30
31
public abstract class MongoCursor : IEnumerable
31
32
{
32
33
// private fields
33
- private MongoServer _server ;
34
- private MongoDatabase _database ;
35
- private MongoCollection _collection ;
36
- private IMongoQuery _query ;
34
+ private readonly MongoCollection _collection ;
35
+ private readonly MongoDatabase _database ;
36
+ private readonly IMongoQuery _query ;
37
+ private readonly IBsonSerializer _serializer ;
38
+ private readonly MongoServer _server ;
37
39
private IMongoFields _fields ;
38
40
private BsonDocument _options ;
39
41
private QueryFlags _flags ;
@@ -51,12 +53,14 @@ public abstract class MongoCursor : IEnumerable
51
53
/// <param name="collection">The collection.</param>
52
54
/// <param name="query">The query.</param>
53
55
/// <param name="readPreference">The read preference.</param>
54
- protected MongoCursor ( MongoCollection collection , IMongoQuery query , ReadPreference readPreference )
56
+ /// <param name="serializer">The serializer.</param>
57
+ protected MongoCursor ( MongoCollection collection , IMongoQuery query , ReadPreference readPreference , IBsonSerializer serializer )
55
58
{
56
- _server = collection . Database . Server ;
57
- _database = collection . Database ;
58
59
_collection = collection ;
60
+ _database = collection . Database ;
61
+ _server = collection . Database . Server ;
59
62
_query = query ;
63
+ _serializer = serializer ;
60
64
_readPreference = readPreference ;
61
65
}
62
66
@@ -224,6 +228,14 @@ public virtual IBsonSerializationOptions SerializationOptions
224
228
}
225
229
}
226
230
231
+ /// <summary>
232
+ /// Gets the serializer.
233
+ /// </summary>
234
+ public virtual IBsonSerializer Serializer
235
+ {
236
+ get { return _serializer ; }
237
+ }
238
+
227
239
/// <summary>
228
240
/// Gets whether the cursor has been frozen to prevent further changes.
229
241
/// </summary>
@@ -241,13 +253,14 @@ public virtual bool IsFrozen
241
253
/// <param name="collection">The collection to query.</param>
242
254
/// <param name="query">A query.</param>
243
255
/// <param name="readPreference">The read preference.</param>
256
+ /// <param name="serializer">The serializer.</param>
244
257
/// <returns>A cursor.</returns>
245
- public static MongoCursor Create ( Type documentType , MongoCollection collection , IMongoQuery query , ReadPreference readPreference )
258
+ public static MongoCursor Create ( Type documentType , MongoCollection collection , IMongoQuery query , ReadPreference readPreference , IBsonSerializer serializer )
246
259
{
247
260
var cursorDefinition = typeof ( MongoCursor < > ) ;
248
261
var cursorType = cursorDefinition . MakeGenericType ( documentType ) ;
249
- var constructorInfo = cursorType . GetConstructor ( new Type [ ] { typeof ( MongoCollection ) , typeof ( IMongoQuery ) , typeof ( ReadPreference ) } ) ;
250
- return ( MongoCursor ) constructorInfo . Invoke ( new object [ ] { collection , query , readPreference } ) ;
262
+ var constructorInfo = cursorType . GetConstructor ( new Type [ ] { typeof ( MongoCollection ) , typeof ( IMongoQuery ) , typeof ( ReadPreference ) , typeof ( IBsonSerializer ) } ) ;
263
+ return ( MongoCursor ) constructorInfo . Invoke ( new object [ ] { collection , query , readPreference , serializer } ) ;
251
264
}
252
265
253
266
// public methods
@@ -261,14 +274,36 @@ public virtual MongoCursor<TDocument> Clone<TDocument>()
261
274
return ( MongoCursor < TDocument > ) Clone ( typeof ( TDocument ) ) ;
262
275
}
263
276
277
+ /// <summary>
278
+ /// Creates a clone of the cursor.
279
+ /// </summary>
280
+ /// <typeparam name="TDocument">The type of the documents returned.</typeparam>
281
+ /// <param name="serializer">The serializer to use.</param>
282
+ /// <returns>A clone of the cursor.</returns>
283
+ public virtual MongoCursor < TDocument > Clone < TDocument > ( IBsonSerializer serializer )
284
+ {
285
+ return ( MongoCursor < TDocument > ) Clone ( typeof ( TDocument ) , serializer ) ;
286
+ }
287
+
264
288
/// <summary>
265
289
/// Creates a clone of the cursor.
266
290
/// </summary>
267
291
/// <param name="documentType">The type of the documents returned.</param>
268
292
/// <returns>A clone of the cursor.</returns>
269
293
public virtual MongoCursor Clone ( Type documentType )
270
294
{
271
- var clone = Create ( documentType , _collection , _query , _readPreference ) ;
295
+ return Clone ( documentType , _serializer ) ;
296
+ }
297
+
298
+ /// <summary>
299
+ /// Creates a clone of the cursor.
300
+ /// </summary>
301
+ /// <param name="documentType">The type of the documents returned.</param>
302
+ /// <param name="serializer">The serializer to use.</param>
303
+ /// <returns>A clone of the cursor.</returns>
304
+ public virtual MongoCursor Clone ( Type documentType , IBsonSerializer serializer )
305
+ {
306
+ var clone = Create ( documentType , _collection , _query , _readPreference , serializer ) ;
272
307
clone . _options = _options == null ? null : ( BsonDocument ) _options . Clone ( ) ;
273
308
clone . _flags = _flags ;
274
309
clone . _skip = _skip ;
@@ -312,7 +347,7 @@ public virtual BsonDocument Explain()
312
347
public virtual BsonDocument Explain ( bool verbose )
313
348
{
314
349
_isFrozen = true ;
315
- var clone = Clone < BsonDocument > ( ) ;
350
+ var clone = Clone < BsonDocument > ( BsonDocumentSerializer . Instance ) ;
316
351
clone . SetOption ( "$explain" , true ) ;
317
352
clone . _limit = - clone . _limit ; // TODO: should this be -1?
318
353
var explanation = clone . FirstOrDefault ( ) ;
@@ -647,8 +682,9 @@ public class MongoCursor<TDocument> : MongoCursor, IEnumerable<TDocument>
647
682
/// <param name="collection">The collection.</param>
648
683
/// <param name="query">The query.</param>
649
684
/// <param name="readPreference">The read preference.</param>
650
- public MongoCursor ( MongoCollection collection , IMongoQuery query , ReadPreference readPreference )
651
- : base ( collection , query , readPreference )
685
+ /// <param name="serializer">The serializer.</param>
686
+ public MongoCursor ( MongoCollection collection , IMongoQuery query , ReadPreference readPreference , IBsonSerializer serializer )
687
+ : base ( collection , query , readPreference , serializer )
652
688
{
653
689
}
654
690
0 commit comments