Linq überprüfen, ob Wert bereits vorhanden (FirstOrDefault)

  • VB.NET
  • .NET 9

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Linq überprüfen, ob Wert bereits vorhanden (FirstOrDefault)

    Hallo zusammen,

    ich lade mir eine XML Datei von einer Webseite (responseBody). Dieser wird dann in meine Datenbank geschrieben. Hier soll das Programm nochmals mittels FirstorDefault der Wert schon vorhanden ist. Aber leider sagt mir das Programm jedesmal, dass der Wert nicht vorhanden ist, obwohl ein Eintrag mit diesem Wert schon vorhanden ist... wo ist hier mein Denkfehler?

    VB.NET-Quellcode

    1. Dim doc As New XmlDocument
    2. doc.LoadXml(responseBody)
    3. Dim root As XmlNode = doc.DocumentElement
    4. Dim title As XmlNodeList = root.SelectNodes("/rss/channel/item/title")
    5. Dim Description As XmlNodeList = root.SelectNodes("/rss/channel/item/description")
    6. Dim link As XmlNodeList = root.SelectNodes("/rss/channel/item/link")
    7. Dim datum As XmlNodeList = root.SelectNodes("/rss/channel/item/pubDate")
    8. For i As Integer = 0 To title.Count - 1
    9. If _Feed_Daten.Feeds.FirstOrDefault(Function(x) x.Title.Replace(vbLf, " ") = title(i).InnerText.Replace(vbLf, " ") Or x.Beschreibung = Description(i).InnerText.Replace(vbLf, " "), Nothing) Is Nothing Then
    10. If datum.Count = 0 Then
    11. _Feed_Daten.Feeds.AddFeedsRow(Date.Now, item, Description(i).InnerText.Replace(vbLf & " ", ""), title(i).InnerText.Replace(vbLf & " ", ""), link(i).InnerText, 0)
    12. Else
    13. _Feed_Daten.Feeds.AddFeedsRow(CDate(datum(i).InnerText), item, Description(i).InnerText.Replace(vbLf & " ", ""), title(i).InnerText.Replace(vbLf & " ", ""), link(i).InnerText, 0)
    14. End If
    15. End If
    16. Next
    Ich habe festgestellt, dass man (zumindest anfangs, inzwischen mache ich es immer) LINQ-Abfragen aufteilen sollte. Allein für Zeilenlänge, Verständnis und Debugging. Teste Deine Daten nach und nach. Und ggf. mit ner For-Schleife statt mit LINQ.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Das ist echt schade, dass man ein Linq immer erst inne Variable drücken muss damit man sieht was drin is, weil an sich isses dafür gemacht, dass man, .Where().GroupBy().Sum() hintereinanderhängt. Wie halt eine Query ausschaut.

    @trix0
    Warum Replaced du in den Titeln, die du vergleichst, jeweils dasselbe? Wenn die nachher gleich sind, waren die vorher auch gleich.
    Wenn du das mögliche Ergebnis von .FirstOrDefault nicht brauchst, dann nimm .Any da sparste dir das auf Nothing prüfen.

    VB.NET-Quellcode

    1. For i As Integer = 0 To title.Count - 1
    2. If Not _Feed_Daten.Feeds.Any(Function(x) x.Title = title(i).InnerText OrElse x.Beschreibung = Description(i).InnerText.Replace(vbLf, " ")) Then
    3. If datum.Count = 0 Then
    4. _Feed_Daten.Feeds.AddFeedsRow(Date.Now, item, Description(i).InnerText.Replace(vbLf & " ", ""), title(i).InnerText.Replace(vbLf & " ", ""), link(i).InnerText, 0)
    5. Else
    6. _Feed_Daten.Feeds.AddFeedsRow(CDate(datum(i).InnerText), item, Description(i).InnerText.Replace(vbLf & " ", ""), title(i).InnerText.Replace(vbLf & " ", ""), link(i).InnerText, 0)
    7. End If
    8. End If
    9. Next
    Vermutlich sind die Strings einfach nicht wie du erwartest, vielleicht hat der eine vbCrLf statt vbLf, sowas.
    Du könntest auch einfach das dafür vorgesehenen Element guid nehmen.

    RSS <guid> Element schrieb:

    The <guid> element defines a unique identifier for the item.
    kannst auch mal so probieren - find ich leserlicher:

    VB.NET-Quellcode

    1. For i As Integer = 0 To title.Count - 1
    2. dim title = title(i).InnerText
    3. dim descr = Description(i).InnerText.Replace(vbLf, " ")
    4. If Not _Feed_Daten.Feeds.Any(Function(x) x.Title = title OrElse x.Beschreibung = descr) Then
    5. descr = Description(i).InnerText.Replace(vbLf & " ", "")
    6. title = title.Replace(vbLf & " ", "")
    7. dim dt = If(datum.Count = 0, Date.Now, CDate(datum(i).InnerText))
    8. _Feed_Daten.Feeds.AddFeedsRow(dt, item, descr, title, link(i).InnerText, 0)
    9. End If
    10. Next