2016-08-03 20 views
5

Prehistory: Bir XML şemasından (XSD) oluşturulan bir sınıf hiyerarşisine (büyük bir tane) sahibim.MongoDB С # sürücüsünü kullanarak obj.ToBsonDocument() öğesini çağırarak, boş değerleri global olarak nasıl yok sayılır?

MyObj obj; 

Günümüzde: Aslında oluşturulan sınıf hiyerarşisi kullanarak bir nesneye bir XML bir dize değeri, ayrıştırmak gerekir ve sonra MongoDB içine nesne koymak gerekir. kodudur:

sorun
private BsonDocument XmlToBson(string content) 
{ 
    MyObj obj; 
    using (var reader = new StringReader(content)) 
    { 
     var serializer = new XmlSerializer(typeof(MyObj)); 
     obj = (MyObj) serializer.Deserialize(reader); 
    } 

    return obj.ToBsonDocument(); 
} 

: Ben boş bir sürü çocuk hiyerarşisinde nesneleri var, Robomongo içinde şuna benzer:

Object which is null is added

Ben null adlı eklemekten kaçının istiyorum veritabanına nesneleri. Öznitelikler veya lambda ifadeleri kullanarak Ignoring Default Values burada açıklandığı gibi, bunları tek tek görmezden gelebileceğimi biliyorum. Fakat hiyerarşi büyük ve karmaşık olduğu için bu yaklaşımı sevmiyorum. Boş değerleri olduğunda yok sayılması gereken tüm özellikleri listelemek için tembel davranıyorum. Dahası, sınıf gelecekte yeniden canlandırılabilir ve göz ardı edilmesi gereken özelliklerin listesini desteklemek için bir kabus olacaktır.

Soru: Nasıl hedefe ulaşabilirsiniz ve küresel nesne hiyerarşide bulunan olursa olsun boş değerler göz ardı? MongoDB C# driver ver ile çalışıyorum. 2.2.

+0

Hey Antipod, onları görmezden gelirseniz onları zorlarsınız ve bir "null" değeri denetimi ile kaldırmazsınız. Btw'yi "göz ardı et" ile neyi kastediyorsunuz, yoksa onları yerleştirmeyin veya başka bir nesneyi "yer tutucu" olarak sütuna boşaltır mı? –

+0

"Yok say" derken onları veritabanında görmek istemiyorum. Sahte değerler koymak, yani kullanılmayacak olan değerler, iyi bir fikir gibi gelmiyor, veritabanında çöp olmasını istemiyorum. Ve bir şey boş olup olmadığını (nasıl?) Kontrol edin ve bir yük gibi geliyor ya da muhtemelen ne demek istediğini anlamıyorum. – Antipod

+0

Bkz. Http://stackoverflow.com/a/43259080/194717 – Tony

cevap

6

Konvansiyon paketlerini kaydederek serileştirirken çoğu özelliğin etkilerini tüm özelliklere uygulayabilirsiniz. Serileştirme ve serileştirme işlemi sırasında [IgnoreIfDefault] özniteliğinin tüm özelliklerine örtük olarak uygulandığı IgnoreIfDefaultConvention'un altında, aşağıdaki .

var anon = new 
{ 
    Foo = "bar", 
    Baz = (string)null, 
}; 

ConventionRegistry.Register("IgnoreIfDefault", 
          new ConventionPack { new IgnoreIfDefaultConvention(true) }, 
          t => true); 

var bsonDocument = anon.ToBsonDocument(); 

Bu

sadece Foo anahtarını içeren bir belge verecektir.

İstenildiğinde, serileştirme işleminden sonra bu kongre paketini Remove() olarak da adlandırabilirsiniz.

+2

Bu çok zarif, keşke uzun zamandır bunu bilmek isterdim! –