Mongo Linq -Abfrage ignoriert die benutzerdefinierte Serialisierung des LINQ -Arguments mit dem LINQ -Anbieter V3
Posted: 11 Jul 2025, 16:28
Ausgabe
Wir haben einen benutzerdefinierten Serializer für einen Enum (messvaluetype), der die Enum als String in MongoDB speichert und es von einem String zurück in den Umfeld des Abfragers. Wenn nicht, funktioniert alles wie erwartet.
Benutzerdefinierter Serializer für MessvalUeType :
Erwartete Verhalten
Beim Speichern eines Dokuments sollte ValuEType als Zeichenfolge in MongoDB gespeichert werden. Beim Einsetzen eines Objekts wird der Serializer aufgerufen und der Enum als Zeichenfolge bestehen. Wenn der Deserializer als ganzes Dokument zurückfasst, wird der Deserializer aufgerufen.
Dies hat im Linq-Anbieter V2 gut funktioniert, aber im LINQ-Anbieter V3 stimmt es nicht mehr überein.) an den Serializer übergeben, damit er vor der Ausführung der Abfrage in eine Zeichenfolge konvertiert werden kann? In LINQ -Abfragen?>
Wir haben einen benutzerdefinierten Serializer für einen Enum (messvaluetype), der die Enum als String in MongoDB speichert und es von einem String zurück in den Umfeld des Abfragers. Wenn nicht, funktioniert alles wie erwartet.
Code: Select all
public class TestA
{
public MeasurementValueType ValueType { get; set; }
}
public enum MeasurementValueType : ushort
{
Distance = 1,
Angle = 2
}
Code: Select all
public class MeasurementValueTypeSerializer : StructSerializerBase
{
public override void Serialize(BsonSerializationContext context, BsonSerializationArgs args, MeasurementValueType value)
{
BsonSerializer.Serialize(context.Writer, value.ToString());
}
public override MeasurementValueType Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
{
var measurementValueType = (MeasurementValueType)Enum.Parse(
args.NominalType,
BsonSerializer.Deserialize(context.Reader)
);
return measurementValueType;
}
}
< /code>
Registriert in Startup: < /p>
BsonSerializer.RegisterSerializer(typeof(MeasurementValueType), new MeasurementValueTypeSerializer());
Beim Speichern eines Dokuments sollte ValuEType als Zeichenfolge in MongoDB gespeichert werden. Beim Einsetzen eines Objekts wird der Serializer aufgerufen und der Enum als Zeichenfolge bestehen. Wenn der Deserializer als ganzes Dokument zurückfasst, wird der Deserializer aufgerufen.
Code: Select all
database.TestACollection.Insert(new TestA { ValueType = MeasurementValueType.Angle });
var match = database.TestACollection
.AsQueryable()
.Single(x => x.ValueType == MeasurementValueType.Angle);
Code: Select all
MeasurementValueType.Angle