LinqToXML Code läuft in C# aber nicht in VB.NET

Alles funktioniert immer nur solange bis was neues kommt.
So,...
Ich habe nun noch das Problem, dass es das Element "Text" selten aber manchmal nicht gibt.

item2.Elements("Text")

Ich dachte eigentlich es sei damit abgefangen, wenn ich dies in das Where Statement schreibe. Dem ist aber nicht so. Ich bekomme die Meldung:

Bei der Auflistung wurde kein Ergebnis zurückgeliefert.

Der unten aufgeführte Code ist in einer verschachtelten Abfrage.

Code:
select new {
....
                                      TagName = (from item2 in item.Parent.Parent.Parent.Elements()
                                                 where item2.Attributes("TYPE").Count() == 1 && item2.Attribute("TYPE").Value == "107" && item2.Elements("Text").Count() > 0
                                                 select item2.Elements("Text").Count() > 0 ? item2.Elements("Text").First().Value : string.Empty)
}

any ideas?
 
Alles funktioniert immer nur solange bis was neues kommt.
So,...
Ich habe nun noch das Problem, dass es das Element "Text" selten aber manchmal nicht gibt.

item2.Elements("Text")

Ich dachte eigentlich es sei damit abgefangen, wenn ich dies in das Where Statement schreibe. Dem ist aber nicht so. Ich bekomme die Meldung:

Bei der Auflistung wurde kein Ergebnis zurückgeliefert.

Der unten aufgeführte Code ist in einer verschachtelten Abfrage.

Code:
select new {
....
TagName = (from item2 in item.Parent.Parent.Parent.Elements()
                      where item2.Attributes("TYPE").Count() == 1 && item2.Attribute("TYPE").Value == "107" && item2.Elements("Text").Count() > 0
                      select item2.Elements("Text").Count() > 0 ? item2.Elements("Text").First().Value : string.Empty)
}

any ideas?
 
Hi.

Wenn du schon in der where Klausel die Elemente ausschließt, die kein Text Element haben, dann kann natürlich nichts mehr ausgewählt werden.

C#:
(from item2 in item.Parent.Parent.Parent.Elements()
       where item2.Attributes("TYPE").Count() == 1 && item2.Attribute("TYPE").Value == "107" && item2.Elements("Text").Count() > 0
       select item2.Elements("Text").First().Value)  COALESCING_OPERATOR string.Empty
Statt COALESCING_OPERATOR mußt du den "Verbindungsoperator" einsetzen. Leider erlaubt das Forum keine doppelten Fragezeichen...

Gruß
 
Hallo deepthroat,
ich bin übrigens auch deepthroat Fan.

Gute Idee mit dem Operator. Das funktioniert auch, sodass ich keinen Fehler mehr bekommen. Ich denke, dass ich es aber ein wenig anders machen muss.

Mal kurz zur Übersicht, vielleicht hast du dazu auch eine gute Idee.

Im Moment ist TagName in einem neuene anonymen Datentyp. Das ist vorübergehend zum Testen so, damit ich sehe, was alles zurückkommt aus der Abfrage. Später ist es ein definierter Datentyp (Klasse) in der TagName ein String ist. Deshalb ist es notwendig, dass ich auch nur ein Ergebnis zurückbekomme. Falls mehrere zurückkommen, da es mehrere Elemente mit "Text" gibt, möchte ich eine entsprechende Meldung eintragen anstatt dem item2.Elements("Text").First().Value (was ja eigentlich mal item2.Element("Text").Value heißen müsste, wenn nur noch eines zurückkommt). Im Moment bekomme ich mehrere Texte zurück und wenn kein Text gefunden wurde oder mehrere bekomme ich mit dem unteren Code auch nicht den entsprechenden Eintrag. Sprich es geht noch gar nischts, bis auf das Kompilieren was fehlerfrei ist. Geht das mit Join und wenn ja nur mit Join?

Code:
select new {
TagName = (from item2 in item.Parent.Parent.Parent.Elements()
                        where item2.Attributes("TYPE").Count() == 1 && item2.Attribute("TYPE").Value == "107"
                        select item2.Elements("Text") == null ? "Kein Text gefunden" : item2.Elements("Text").Count() > 1 ? "Zuviele Texte gefunden" : item2.Elements("Text").First().Value)
}
 
Mal kurz zur Übersicht, vielleicht hast du dazu auch eine gute Idee.

Im Moment ist TagName in einem neuene anonymen Datentyp. Das ist vorübergehend zum Testen so, damit ich sehe, was alles zurückkommt aus der Abfrage. Später ist es ein definierter Datentyp (Klasse) in der TagName ein String ist. Deshalb ist es notwendig, dass ich auch nur ein Ergebnis zurückbekomme. Falls mehrere zurückkommen, da es mehrere Elemente mit "Text" gibt, möchte ich eine entsprechende Meldung eintragen anstatt dem item2.Elements("Text").First().Value (was ja eigentlich mal item2.Element("Text").Value heißen müsste, wenn nur noch eines zurückkommt). Im Moment bekomme ich mehrere Texte zurück und wenn kein Text gefunden wurde oder mehrere bekomme ich mit dem unteren Code auch nicht den entsprechenden Eintrag.
Ja, welchen Eintrag möchtest du denn auswählen wenn es mehrere Einträge gibt?

Gruß
 
Wenn es mehrere gibt, möchte ich, dass Tagname keinen der Values erhält sondern den statischen Text "Zuviele Texte gefunden" zuweisen. Wenn kein Text gefunden wird, sprich "null" ist, soll "kein Text gefunden" TagName zugewiesen werden.

Ich dachte ich könnte das mit dieser Zeile erschlagen, was aber nciht funktioniert:
Code:
select item2.Elements("Text") == null ? "Kein Text gefunden" : item2.Elements("Text").Count() > 1 ? "Zuviele Texte gefunden" : item2.Elements("Text").First().Value)
 
Wenn es mehrere gibt, möchte ich, dass Tagname keinen der Values erhält sondern den statischen Text "Zuviele Texte gefunden" zuweisen. Wenn kein Text gefunden wird, sprich "null" ist, soll "kein Text gefunden" TagName zugewiesen werden.

Ich dachte ich könnte das mit dieser Zeile erschlagen, was aber nciht funktioniert:
Code:
select item2.Elements("Text") == null ? "Kein Text gefunden" : item2.Elements("Text").Count() > 1 ? "Zuviele Texte gefunden" : item2.Elements("Text").First().Value)
So kann es auch nicht funktionieren. Du hast eine Menge von Elementen aus denen du eine Auswahl triffst und erhälst zum Schluß natürlich daraus eine Menge von Elementen (also 0 bis n).

Du mußt die Elemente erst auswählen und danach schauen wieviele es sind. Ich weiß nicht ob es dafür eine elegantere Methode gibt, aber dies funktioniert:
C#:
(from k in Enumerable.Range(0, 1)
   let items = from item2 in item.Parent.Parent.Parent.Elements() where ... select item2
   let c = items.Count()
   select (c == 0 ? "nothing" : c > 1 ? "too much" : items.First().Value)).First()
Gruß
 
God bless you!

Und auf so was soll man kommen? Das hier: (from k in Enumerable.Range(0, 1)
dient also nur als Pseudocode, da from... die erste Anweisung sein muss?
 

Neue Beiträge

Zurück