Laden...

Union von zwei Listen mit Linq will nicht

Erstellt von sra vor 14 Jahren Letzter Beitrag vor 14 Jahren 945 Views
S
sra Themenstarter:in
230 Beiträge seit 2004
vor 14 Jahren
Union von zwei Listen mit Linq will nicht

Hallo zusammen

Ich habe da grade wieder ein kleines Problem im Zusammenhang mit Linq to SQL.

In einem Tool von uns kann man "Besuche" speichern. Sobald ein Besuch gelöscht wird, kommt er aus der Tabelle "Besuch" raus in die "Besuch_Archiv" Tabelle (wieso auch immer nicht einfach ein Status gesetzt wird). Mein Auftrag ist es nun eine Suche über beide Tabellen hinweg zu realisieren.

Gelöst habe ich das mit zwei Abfragen, welche mir die Daten von jeweils einer der Tabellen holen. Danach werden die beiden per Union zusammengefügt, sortiert und ans Grid gebunden.

Um in beiden Abfragen den gleichen Typ zu haben (also keinen anonymen) habe ich mir eine Klasse erstellt, in die ich dann die Resultate per select new SuchResultat(...) speichere. Das Problem ist, dass die Archivtabelle zusätzlich die beiden Felder gelöschtAm und gelöschtVon enthält. Natürlich enthält meine SuchResultat-Klasse diese beiden Felder auch. Wenn ich nun aber folgendes mache, bekomme ich einen Fehler:


        Dim result = From b In besuche _
                     Select New Suchergebnis( _
                         b.b.BeBesuchsNr, _
                         ..., _
                         Nothing, _
                         Nothing)

        result = result.Union(From b In besuche_archiv _
                     Select New Suchergebnis( _
                         b.b.BeBesuchsNr, _
                         ...
                         b.b.BeGeloeschtVon, _
                         b.b.BeGeloeschtAm))

Der Fehler ist folgender: System.Data.SqlClient.SqlException: Alle Abfragen in einem Abfrageausdruck, die einen UNION-Operator enthalten, müssen gleich viele Ausdrücke in ihren Auswahllisten enthalten.

Hat jemand schon erfahrungen damit gemacht? Meiner Meinung nach sollte man die zwei Listen der Klasse SuchResultat doch zusammenfügen können, auch wenn ich im nicht genau die selben Werte dem Konstruktor übergeben.

Gruss
sra

Wenn Zeit in Geschichte übergeht und keine Blüten trägt werden Zukunftsbilder blass //Clueso

S
sra Themenstarter:in
230 Beiträge seit 2004
vor 14 Jahren

lol

Kaum habe ich im Titel geschrieben "... von zwei Listen", da merke ich, dass ich ja wirklich Listen draus machen könnte, da ich - wie im Beispiel ersichtlich - bisher "nur" IQueryables hatte. Und siehe da: klappt.

Danke trotzdem 😃

Wenn Zeit in Geschichte übergeht und keine Blüten trägt werden Zukunftsbilder blass //Clueso

2.760 Beiträge seit 2006
vor 14 Jahren

Das liegt an VB. Wenn du das mit C# machen würdest dann würde es sicherlich funktionieren 😉

Ich DIM dich!

1.564 Beiträge seit 2007
vor 14 Jahren

Hallo

Also an LINQ liegt es nicht (auch nicht in VB 😉 ). Das Funktioniert schon:


      Dim l1 As New List(Of String)
      l1.Add("foo")
      l1.Add("bar")

      Dim l2 As New List(Of String)
      l2.Add("blah")
      l2.Add("bluff")

      Dim ret As IEnumerable(Of String) = l1.Union(l2)

      For Each s As String In ret
         Console.WriteLine(s)
      Next

Der Fehler ist ein SQL Fehler. Ich kenne mich mit LINQ2SQL leider nicht groß aus aber die Fehlermeldung bedeutet, dass deine Aktion eine UNION Statement erzeugt. Hierbei müssen beide Statements exakt die gleichen Spalten an der gleichen Position zurückliefern.

Grüße
Flo

Blog: Things about Software Architecture, .NET development and SQL Server
Twitter
Google+

Je mehr ich weiß, desto mehr weiß ich was ich noch nicht weiß.

2.760 Beiträge seit 2006
vor 14 Jahren

AAAAAAAAaahhhhhhhhhhhhhhhhhhhhhhhhhh! Noch mehr Dimdings....

1.564 Beiträge seit 2007
vor 14 Jahren

Blog: Things about Software Architecture, .NET development and SQL Server
Twitter
Google+

Je mehr ich weiß, desto mehr weiß ich was ich noch nicht weiß.

S
sra Themenstarter:in
230 Beiträge seit 2004
vor 14 Jahren

VB wird ja in der nächsten Version auch schöner (dann braucht es die _ nicht mehr für Zeilenumbrüche innerhalb eines Befehls), aber bei den CSharp jungs ist man schon kompetenter aufgehoben 😄

Ausserdem kann man von CSharpern erwarten, dass sie VB lesen können - umgekehrt nicht unbedingt.

Gruss von einem verhinderten CSharper, der aber eh bald auf Kunst umsteigt ^^

Wenn Zeit in Geschichte übergeht und keine Blüten trägt werden Zukunftsbilder blass //Clueso

1.564 Beiträge seit 2007
vor 14 Jahren

Ausserdem kann man von CSharpern erwarten, dass sie VB lesen können - umgekehrt nicht unbedingt.

Also ich habe nix gegen VB aber den Satz verstehe ich nicht.

Ein Entwickler sollte - meiner Meinung nach - eigentlich so ziemlich jeden Code halbwegs lesen können. Speziell im Fall von VB.Net und C# die auf dem komplett gleichen Framework basieren.

Blog: Things about Software Architecture, .NET development and SQL Server
Twitter
Google+

Je mehr ich weiß, desto mehr weiß ich was ich noch nicht weiß.

S
sra Themenstarter:in
230 Beiträge seit 2004
vor 14 Jahren

naja.... Es fängt ja schon bei **int? **oder dim as nullable(of integer) an und geht dann so weiter. p => oder **function(p) **.

Den ? : Operator gibt es gar nicht und wie man unter VB.net eine Instanz einer Klasse erstellt und nach belieben im selben Befehl noch Properties auf füllt, weiss ich bis heute nicht.

Ich werde bei uns in der Firma ab und zu gerufen um ein CSharp Codeschnipsel nach VB zu übersetzen - auch wenn die anderen das natürlich auch könnten, würden sie sich mal kurz mit CSharp auseinandersetzen.

Wenn Zeit in Geschichte übergeht und keine Blüten trägt werden Zukunftsbilder blass //Clueso