2016-07-17 11 views
0

Ich versuche, eine Linq-Abfrage für eine Sammlung dynamischer Objekte basierend auf dem Wert eines Sub-Sub-Felds und dann Gibt den einzelnen Wert eines anderen Felds als Ganzzahl zurück.Wie kann ich eine einzelne Ganzzahl aus Linq von einem Array von Objekten zurückgeben, die andere geschachtelte Werte haben

Was ich habe, so weit ist:

int itemId = (
       from x in ((IEnumerable<dynamic>)allpets.pets.collected) 
       where x.stats.speciesId == 294 
       select x.itemId 
      ).SingleOrDefault() 

Das Problem ist, manchmal fand das Ergebnis hat kein Feld x.itemId, die eine Ausnahme verursacht endet.

'System.Dynamic.DynamicObject' enthält keine Definition für 'itemId'

Ich habe x?.itemId versucht, x.?itemId, x.itemId? und ?x.itemId, die die einzigen Orte zu sein scheinen ich erfassen kann Nullen.

Der andere Teil ist dieser Teil eines komplexeren verschachtelten Linq wählen ist, und wo der Wert 294 befindet, ist eigentlich p.stats.speciesId (Code-Schnipsel unten, so können Sie sehen, warum diese inline sein muss)

List<MasheryTypes.pet> pets = ((IEnumerable<dynamic>)json.pets).Select(
    p => new MasheryTypes.pet(
     Convert.ToBoolean(p.canBattle), 
     p.creatureId, 
     p.name, 
     p.family, 
     p.icon, 
     p.qualityId, 
     new MasheryTypes.petstats(
      p.stats.speciesId, 
      p.stats.breedId, 
      p.stats.petQualityId, 
      p.stats.level, 
      p.stats.health, 
      p.stats.power, 
      p.stats.speed 
     ), 
     p.strongAgainst?[0], 
     p.typeId, 
     p.weakAgainst?[0], 
     cageable.Any(
      c => c == p.creatureId 
     ), 
     p.itemId = (from x in ((IEnumerable<dynamic>)allpets.pets.collected) 
        where x.stats.speciesId == p.stats.speciesId 
        select x.itemId).SingleOrDefault() 
    ) 
).ToList(); 
+0

Ihre Tierklasse scheint keine 'itemId' zu haben. Schwer zu sagen, ohne die gesamte Klasse und ihre Eigenschaften zu sehen – lokusking

+1

@lokusking - es tut es tatsächlich, aber fehlt auf Aufzeichnungen, die es nicht erfordern. Die Quelle der Daten liegt nicht in meiner Kontrolle. Ich habe eine Probe der Daten hier: https://paste.ee/p/VU25M (war zu groß für pastebin) –

+2

Anstatt 'dynamische' zu ​​verwenden, würde ich statische Klassen basierend auf dem JSON-Format erstellen und dazu deserialisieren. Probieren Sie Visual Studio "Bearbeiten -> Inhalte einfügen -> JSON als Klassen einfügen" -Funktion. –

Antwort

0

Versuchen Sie dies.

int itemId = (
      from x in ((IEnumerable<dynamic>)allpets.pets.collected) 
      where x.GetType().GetProperty("itemId") != null && x.stats.speciesId == 294 
      select x.itemId 
     ).SingleOrDefault()