2016-01-21 43 views
0

我将MongoDB文档映射到C#对象(请参阅this question了解一些背景知识),并且一切正常,但是我开始查找一些空的条目。原因是以前的XML只有<VehicleEntry></VehicleEntry>标签,所以它被作为'null'插入到BsonDocument的数组中。如何将'null'引用映射到从MongoDB到POCO的默认构造函数?

我可以理解这是预期的行为,但是当我将它映射到我编写的VehicleEntry类时,它显示为空对象。在我的映射类中,我列出了一堆BsonDefaultValues,甚至添加了一个默认构造函数,但它仍然显示如果数据库中的值为'null',它将创建一个'null'引用对象。

我如何设置它以匹配对所有默认值的对象的空引用?

回答

0

一种解决方案是改变你的LINQ只退回没有空列表值:

var results = collection.AsQueryable() 
    .Where(v => v.ProjectName.Equals("input") 
    .SelectMan(v => v.VehicleEntries) 
    .Where(i => i != null) 
    .ToList(); 

这并没有解决其存在的空值的问题,但它提出它被返回任何结果并在显示数据时避免NPE。

1

如果你创建自己的BsonSerializers并将其分配给VehicleEntry类型,你会那么可以说,如果该数值为null,则返回一个default(VehicleEntry)

[TestFixture] 
public class StackQuestionTest 
{ 
    [Test] 
    public void GivenABsonDocumentWithANullForAnPossibleEmbeddedDocument_When_ThenAnInstanceIsSetAsTheEmbeddedDocument() 
    { 
     BsonSerializer.RegisterSerializationProvider(new VehicleEntryBsonSerializationProvider()); 

     var document = new BsonDocument() 
     { 
      {"OtherProperty1", BsonString.Create("12345")}, 
      {"OtherProperty2", BsonString.Create("67890")}, 
      {"VehicleEntry", BsonNull.Value}, 
     }; 

     var rootObject = BsonSerializer.Deserialize<RootObject>(document); 

     Assert.That(rootObject.OtherProperty1, Is.EqualTo("12345")); 
     Assert.That(rootObject.OtherProperty2, Is.EqualTo("67890")); 
     Assert.That(rootObject.VehicleEntry, Is.Not.Null); 
     Assert.That(rootObject.VehicleEntry.What, Is.EqualTo("Magic")); 
    } 
} 

public class VehicleEntrySerializer : BsonClassMapSerializer<VehicleEntry> 
{ 
    public override VehicleEntry Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args) 
    { 
     if (context.Reader.GetCurrentBsonType() == BsonType.Null) 
     { 
      context.Reader.ReadNull(); 

      return new VehicleEntry(); 
     } 

     return base.Deserialize(context, args); 
    } 

    public VehicleEntrySerializer(BsonClassMap classMap) : base(classMap) 
    { 

    } 
} 

public class VehicleEntryBsonSerializationProvider : IBsonSerializationProvider 
{ 
    public IBsonSerializer GetSerializer(Type type) 
    { 
     if (type == typeof(VehicleEntry)) 
     { 
      BsonClassMap bsonClassMap = BsonClassMap.LookupClassMap(type); 

      return new VehicleEntrySerializer(bsonClassMap); 
     } 

     return null; 
    } 
} 


public class RootObject 
{ 
    public string OtherProperty1 { get; set; } 

    public string OtherProperty2 { get; set; } 

    public VehicleEntry VehicleEntry { get; set; } 
} 

public class VehicleEntry 
{ 
    public string What { get; set; } = "Magic"; 
} 

http://mongodb.github.io/mongo-csharp-driver/2.0/reference/bson/serialization/

+0

'公共无效GivenABsonDocumentWithANullForAnPossibleEmbeddedDocument_When_ThenAnInstanceIsSetAsTheEmbeddedDocument ()'很好。 – KDecker

+0

'公共无效TestWhatEverIsInQuestion()' –