使用MongoDB C#驱动程序将null读入可为空的int

时间:2017-01-11 22:49:08

标签: c# .net mongodb mongodb-.net-driver

我的MongoDB中有数据存储可空的int,通常为null。我在C#端的模型的变量为int? MaterialID

当我运行.Query.FirstOrDefault()时,我收到错误“输入字符串的格式不正确。”每当它试图从Mongo读取空值时(整数工作正常)。

我设法通过改变我的int来解决这个问题?到一个字符串,然后再将其转换回一个int?,但这是一个我真的不喜欢的可怕的黑客攻击。任何人都有任何关于如何从Mongo读取null到我的int的想法?在C#方面?

感谢。

我的JSON:

 "Collection" : {
        "List" : [ 
            {
                "ID" : "40",
                "StartDate" : ISODate("2013-01-01T00:00:00.000Z"),
                "EndDate" : ISODate("2013-12-31T00:00:00.000Z"),
                "MaterialID" : "3"
            }, 
            {
                "ID" : "40",
                "StartDate" : ISODate("2014-01-01T00:00:00.000Z"),
                "EndDate" : ISODate("2014-09-30T00:00:00.000Z"),
                "MaterialID" : "null"
            }
        ]

1 个答案:

答案 0 :(得分:1)

您将MaterialID字段存储为数据库中的字符串(类型2)。当然,当您尝试将字符串值分配给可空整数时,您会遇到错误。注意:偶数null存储为带有文本"null"的字符串。我建议您从修复数据库中的数据开始。你可以从mongo shell做到这一点:

> db.collection.find({MaterialID:{$type:2}}).forEach(
    function(doc){ 
       var materialId = (doc.MaterialID == "null") ? null : new NumberInt(doc.MaterialID);
       db.collection.update({_id:doc._id},{$set:{MaterialID: materialId}});
    })

注意:在你的json文档中没有_id字段,但我认为它在那里而不是ID字段。无论如何,您可以根据需要调整脚本。

更改字段类型后,映射到nullable int将正常工作。

BTW还有另一个选项,如果由于某种原因您无法修复数据库中的数据。你可以使用自定义BSON序列化器来转换int吗?字串,反之亦然:

public class NullableIntAsStringSerializer : SerializerBase<int?>
{
    public override void Serialize(
        BsonSerializationContext context, BsonSerializationArgs args, int? value)
    {
        context.Writer.WriteString(value.HasValue ? value.ToString() : "null");
    }

    public override int? Deserialize(
        BsonDeserializationContext context, BsonDeserializationArgs args)
    {
        var str = context.Reader.ReadString();
        return str == "null" ? (int?)null : Int32.Parse(str);
    }
}

并将此序列化程序分配给您的属性

[BsonSerializer(typeof(NullableIntAsStringSerializer))]
public int? MaterialID { get; set; }