none
LINQ To Oject RRS feed

  • Frage

  • Hallo Leute,
    wie kann ich mittels LINQ ein Update-Command auf eine Collection(Of T) anwenden?
    Dim ColMeineKlasse As New Collection(Of cMeineKlasse)

    Mit dem 'gewöhnlichem' SQL auf eine Tabelle geht es so:
                   "UPDATE ColMeineKlasse SET Wert = 12345"

    Wie geht dies aber mit LINQ?

    Vielen Dank im Voraus
    Christian Tauschek




    Christian Tauschek

    Donnerstag, 3. Oktober 2013 08:21

Antworten

  • Ich habe es versucht über die Select-Methode zu lösen. Hier nochmal andere Versionen mit dem kompletten Testcode:

    Option Strict On
    
    Imports System.Collections.ObjectModel
    
    Module Module1
    
        Sub Main()
            Dim list As New Collection(Of TestClass)
            list.Add(New TestClass() With {.Name = "1", .Number = 1})
            list.Add(New TestClass() With {.Name = "11", .Number = 2})
            list.Add(New TestClass() With {.Name = "123", .Number = 3})
            list.Add(New TestClass() With {.Name = "1234", .Number = 4})
            list.Add(New TestClass() With {.Name = "12345", .Number = 5})
            list.Add(New TestClass() With {.Name = "123456", .Number = 6})
    
            'Version 1'
            list = New Collection(Of TestClass)(list.Select(Function(x)
                                                                x.Name = "" ' Einfach einen leeren String zuweisen'
                                                                Return x ' Element wieder zurück geben'
                                                            End Function).ToList())
            Debugger.Break()
    
            'Version 2'
            list = New Collection(Of TestClass)(list.Select(Function(x) SelectItem(x)).ToList())
            Debugger.Break()
    
            'Version 3'
            list = New Collection(Of TestClass)((From x In list Select SelectItem(x)).ToList())
            Debugger.Break()
    
            End
        End Sub
    
        Function SelectItem(x As TestClass) As TestClass
            x.Name = "" ' Einfach einen leeren String zuweisen'
            Return x ' Element wieder zurück geben'
        End Function
    End Module
    
    Class TestClass
        Public Property Name As String
        Public Property Number As Integer
    End Class

    Funktionieren müssten sie alle. Bei mir tun sie es auch. Beim Ausführen kannst du immer beim Anhalten des Debuggers die Liste überprüfen.

    Probiere den Code am besten nochmal in einem neuen Projekt aus. Falls es an einer Projekteinstellung o.ä. liegt.


    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    Donnerstag, 3. Oktober 2013 21:12
    Moderator

Alle Antworten

  • Hallo,
    ich bin kein SQL Profi, aber soweit ich UPDATE...SET kenne, werden damit die Werte einer gesamten Spalte verändert.

    In LINQ kann man so etwas mittels Select lösen:

    Dim list As New Collection(Of TestClass)
    list.Add(New TestClass() With {.Name = "1", .Number = 1})
    list.Add(New TestClass() With {.Name = "11", .Number = 2})
    list.Add(New TestClass() With {.Name = "123", .Number = 3})
    list.Add(New TestClass() With {.Name = "1234", .Number = 4})
    list.Add(New TestClass() With {.Name = "12345", .Number = 5})
    list.Add(New TestClass() With {.Name = "123456", .Number = 6})
    list = New Collection(Of TestClass)(list.Select(Function(x)
                                                        x.Name = "" ' Einfach einen leeren String zuweisen'
                                                        Return x ' Element wieder zurück geben'
                                                    End Function).ToList())


    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.



    Donnerstag, 3. Oktober 2013 09:56
    Moderator
  • Hallo Tom,
    ich habe dein Beispiel getestet aber es scheint bei mir einfach nicht zu funktionieren.
    IntelliSense markiert mir das 'Return' im untenstehenden Ausdruck mit der Meldung, dass an dieser Stelle eine ')' erwartet wird.
    Ist es möglich, dass diese Syntax mit Framework 3.5 (VS2008) so nicht funktioniert?

    list = New Collection(Of TestClass)(list.Select(Function(x) x.Name = "" Return x  End Function).ToList())
    

    mfg
    Christian


    Christian Tauschek

    Donnerstag, 3. Oktober 2013 18:39
  • Bei mir funktioniert es unter .NET 3.5. Wenn ich deine Codezeile bei mir einfüge erhalte ich aber den selben Fehler, da der Compiler (und IntelliSense auch) erwartet das die Function mehrzeilig dargestellt wird.

    Einzeilg geht es bei einfachen Ausdrücken wie:

    list.Select(Function(x) x)
    Es wird x übergeben und x zurück gegeben. Sobald es aber mehrzeilg wird, muss es so aussehen:
    list.Select(Function(x)
                    'Mache was mit x
                    Return x
                End Function)



    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    Donnerstag, 3. Oktober 2013 18:51
    Moderator
  • Hallo Tom,
    ich weiß nicht warum aber es mag bei mir einfach nicht funktionieren - auch nicht in mehrzeiliger Schreibweise.
    Andererseits ist der untenstehende Code wiederum kein Problem

    mfg
    Christian

                Dim Result2 = From AL In colArtikelEintragLieferschein _
                             Group AL By AL.ArtikelEintrag.Artikel.Matchcode Into Group Order By Group.First.ArtikelEintrag.Artikel.Matchcode Ascending _
                             Select New With { _
                             .Artikel = Group.First.ArtikelEintrag.Artikel, _
                             .GesamtmengeAllerLieferscheine = Group.Where(Function(x) x.Lieferschein.Typ = eNCCLieferscheinTyp.Lieferschein).Sum(Function(x) x.ArtikelEintrag.Menge), _
                             .GesamtmengeAllerRetourscheine = Group.Where(Function(x) x.Lieferschein.Typ = eNCCLieferscheinTyp.Retourschein).Sum(Function(x) x.ArtikelEintrag.Menge) _
                             }
    


    Christian Tauschek

    Donnerstag, 3. Oktober 2013 20:18
  • Ich habe es versucht über die Select-Methode zu lösen. Hier nochmal andere Versionen mit dem kompletten Testcode:

    Option Strict On
    
    Imports System.Collections.ObjectModel
    
    Module Module1
    
        Sub Main()
            Dim list As New Collection(Of TestClass)
            list.Add(New TestClass() With {.Name = "1", .Number = 1})
            list.Add(New TestClass() With {.Name = "11", .Number = 2})
            list.Add(New TestClass() With {.Name = "123", .Number = 3})
            list.Add(New TestClass() With {.Name = "1234", .Number = 4})
            list.Add(New TestClass() With {.Name = "12345", .Number = 5})
            list.Add(New TestClass() With {.Name = "123456", .Number = 6})
    
            'Version 1'
            list = New Collection(Of TestClass)(list.Select(Function(x)
                                                                x.Name = "" ' Einfach einen leeren String zuweisen'
                                                                Return x ' Element wieder zurück geben'
                                                            End Function).ToList())
            Debugger.Break()
    
            'Version 2'
            list = New Collection(Of TestClass)(list.Select(Function(x) SelectItem(x)).ToList())
            Debugger.Break()
    
            'Version 3'
            list = New Collection(Of TestClass)((From x In list Select SelectItem(x)).ToList())
            Debugger.Break()
    
            End
        End Sub
    
        Function SelectItem(x As TestClass) As TestClass
            x.Name = "" ' Einfach einen leeren String zuweisen'
            Return x ' Element wieder zurück geben'
        End Function
    End Module
    
    Class TestClass
        Public Property Name As String
        Public Property Number As Integer
    End Class

    Funktionieren müssten sie alle. Bei mir tun sie es auch. Beim Ausführen kannst du immer beim Anhalten des Debuggers die Liste überprüfen.

    Probiere den Code am besten nochmal in einem neuen Projekt aus. Falls es an einer Projekteinstellung o.ä. liegt.


    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    Donnerstag, 3. Oktober 2013 21:12
    Moderator
  • Hallo Tom,
    vielen dank für deine Antworten.
    Deine Versionen 2 und 3 funktionieren.
    Version 1 geht bei mir nicht.
    Möglicherweise liegt es an der IDE.

    mfg
    Christian


    Christian Tauschek

    Freitag, 4. Oktober 2013 15:12