2015-12-23 21 views
5

Ricevo un enorme carico utile di XML dal servizio WCF e ho bisogno di scriverlo in un database SQL. Sto usando l'ultima versione di .NET e Entity Framework 6.Ignorare riferimenti null durante la serializzazione di un enorme documento XML

"Ok, è grandioso," si potrebbe dire, "ma qual è la domanda?"

Bene, l'XML viene deserializzato in oggetti C# (generati da paste-special) e stanno funzionando alla grande. Tuttavia, ogni volta che il carico utile dal servizio non contiene qualche campo, ottengo un'eccezione nulla di riferimento quando sto scrivendo l'oggetto XML verso l'oggetto EF (questo è un metodo di classe):

public ICollection<object> GetObjects() 
{ 
    List<object> objs = new List<object>(); 

    foreach (var i in XmlObject.SubObj.SubObj.SubObj) 
    { 
     objs.Add(new MyEfObject() { 
      Prop1 = XmlObject.SubObj.SubObj.SubObj.ObjProperty // If "ObjProperty" is null, 
                   // I get a null reference exception 
     }); 
    } 

    return objs; 
} 

Quindi, ho codice davvero poco elegante per controllare

if (!ReferenceEquals(XmlObject.SubObj.SubObj.SubObj.ObjProperty, null) { 
    // Do stuff 
} 

Questo sarebbe normalmente bene, ma l'oggetto è così grande e voglio evitare di scrivere questo 150+ volte (e per tutte le proprietà dell'oggetto dell'oggetto).

Ci deve essere un modo più elegante, no?

+1

Si può semplicemente utilizzare '==' ma IMO la parte poco elegante, non è verificare la presenza di 'null' (che può essere evitato usando C# 6'?, 'o pattern null-object) ma il fatto che stai facendo' XmlObject.SubObj.SubObj.SubObj.ObjProperty', non pensi che le tue classi siano _little bit_ troppo accoppiato? BTW you ** may ** 'XmlObject.SubObj.SubObj.SubObj.Where (x => x.property! = Null) .Select (x => new MyEfObject {Prop1 = x.property}). ToList()' –

+0

@AdrianoRepetti Come posso evitare questo? Sto usando le classi generate (da XSD.exe). – Ellis

+0

Ellis, commento aggiornato. È possibile utilizzare LINQ –

risposta

1

Si può semplicemente utilizzare == ma IMO la parte poco elegante, non è verificare la presenza di null (che può essere evitato utilizzando modello nullo-oggetto), ma il fatto che si sta accedendo XmlObject.SubObj.SubObj.SubObj.ObjProperty, penso che le vostre classi sono davvero troppo accoppiati.

Detto questo, se non è possibile modificare questo, allora si può usare LINQ per rendere il codice più leggibile:

public ICollection<MyEfObject> GetObjects() { 
    return XmlObject.SubObj.SubObj.SubObj 
     .Where(x => x.property != null) 
     .Select(x => new MyEfObject { Prop1 = x.property }) 
     .ToList(); 
} 
Problemi correlati