Details
-
Bug
-
Resolution: Fixed
-
Major - P3
-
2.14.1
-
None
-
Fully Compatible
Description
I have a struct that has an "Id" field mapped using a custom serializer. Unfortunately LINQ queries, in my example Find, does not seem to use the serializer, causing the query to not match any documents.
here is a full test case that reproduces the issue:
class ObjectIdAsStringSerializer : SerializerBase<string> |
{
|
public static readonly ObjectIdAsStringSerializer Instance = new ObjectIdAsStringSerializer(); |
|
|
public override string Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args) |
{
|
return context.Reader.ReadObjectId().ToString(); |
}
|
|
|
public override void Serialize(BsonSerializationContext context, BsonSerializationArgs args, string value) |
{
|
context.Writer.WriteObjectId(ObjectId.Parse(value));
|
}
|
}
|
|
|
struct Thing
|
{
|
public string Id { get; set; } |
}
|
|
|
[Test]
|
public async Task test_linq3() |
{
|
BsonClassMap.RegisterClassMap<Thing>(cm =>
|
{
|
cm.MapIdProperty(thing => thing.Id)
|
.SetSerializer(ObjectIdAsStringSerializer.Instance);
|
});
|
|
|
MongoClientSettings settings = MongoClientSettings.FromConnectionString("mongodb://localhost:27017/?replicaSet=rs0"); |
settings.LinqProvider = LinqProvider.V2; // V2 = test passes, V3 = test fails |
var client = new MongoClient(settings); |
string dbName = "testdb-" + Guid.NewGuid(); |
IMongoDatabase database = client.GetDatabase(dbName);
|
const string id = "590df61373b975210006fcdf"; |
IMongoCollection<BsonDocument> coll = database.GetCollection<BsonDocument>("testCollection"); |
await coll.InsertOneAsync(BsonDocument.Create(new Dictionary<string, object?> |
{
|
["_id"] = ObjectId.Parse(id) |
}));
|
IMongoCollection<Thing> typedColl = database.GetCollection<Thing>("testCollection"); |
long count = await typedColl.Find(t => t.Id == id).CountDocumentsAsync(); |
await client.DropDatabaseAsync(dbName);
|
Assert.That(count, Is.EqualTo(1)); |
}
|
Attachments
Issue Links
- related to
-
CSHARP-3449 custom serializers sometimes not used in aggregation
-
- Closed
-