2009-05-06 8 views
1

Sagen wir, ich erstellen zwei Sätze von Tupeln wie so:Arbeiten mit Anonyme Typen mit Linq in VB, C#

Dim losSPResults As List(Of spGetDataResults) = m_dcDataClasses.spGetData.ToList 
    Dim loTupleKeys = From t In losSPResults Select t.key1, t.key2 

    '' Query on an existing dataset: 
    Dim loTupleExistingKeys = from t in m_losSPResults Select t.key3, t.key4 

Jetzt möchte ich wie so Satz Operationen auf diesen beiden Listen auszuführen:

Dim loTupleSetDifference = loTupleKeys.Except(loTupleExistingKeys) 

Offensichtlich kann Linq nicht einen Komparator auf Sätze durchführen, wenn sie nicht wissen, die Sätze einheitliche Definitionen haben, so dass er mir diesen Build-Fehler geben wird:

Option Strict On disallows implicit conversions from 'System.Collections.Generic.IEnumerable(Of < anonymous type>)' to 'System.Collections.Generic.IEnumerable(Of < anonymous type>)'.

Wie arbeite ich mit der Deklaration dieser Sets, damit sie ineinandergreifen? (Nicht viel Glück auf Google)

[Bearbeiten] Noch immer die gleichen Compiler-Fehler:

'*** If we have initialized the list of tools, check to make sure it's up to date 
    Dim loTupleDatabaseTools = From tt In lottTorqueTools _ 
           Select StationIndex = tt.station_index, SlotNumber = tt.slot_number 
    Dim loTupleToolObjects = From tt In m_lottTorqueTools _ 
          Select StationIndex = tt.StationIndex, SlotNumber = tt.SlotNumber 

    Dim loTupleSetDifference = loTupleDatabaseTools.Except(loTupleToolObjects) 

Fehler ist hier:

Dim loTupleSetDifference = loTupleDatabaseTools.Except (loTupleToolObjects)

Error 5 Option Strict On disallows implicit conversions from 'System.Collections.Generic.IEnumerable(Of < anonymous type>)' to 'System.Collections.Generic.IEnumerable(Of < anonymous type>)'.

Antwort

5

Wenn die anonymen Typen die gleichen Eigenschaftennamen mit den gleichen Typen in den s haben ame Reihenfolge, sie sollten die gleichen Typen sein (und damit kompatibel).

EDIT: Basierend auf den Kommentaren und der aktualisierten Frage vermute ich, dass das Bit, das Sie vermissen, die Fähigkeit ist, die Eigenschaften in anonymen Typen zu benennen. Ändern Sie dies:

Dim loTupleExistingKeys = from t in m_losSPResults Select t.key3, t.key4 

in diese:

Dim loTupleExistingKeys = from t in m_losSPResults Select key1=t.key3, key2=t.key4 

Solange die Arten richtig sind, können Sie dann ohne mehr Arbeit in Ordnung sein.

+0

Ah. Ich habe die Namen der Spalten oben geändert. Das muss das Problem sein - die Namen unterscheiden sich? Wie kann ich das beheben? – Daniel

+1

Verwenden Sie die gleichen Namen :) –

+0

Ich wünschte, ich könnte, aber leider unsere DBAs gewählt Spalten Spaltennamen nicht zu den gleichen Namenskonventionen wie wir für Code zu entsprechen. Ein Datensatz besteht aus einer Ergebnismenge einer gespeicherten Prozedur, der andere besteht aus einer Liste von Objekten. Gibt es eine einfache Möglichkeit, die Namen zu ändern oder zu ignorieren oder muss ich diese in einheitlich benannte Datensätze kopieren? – Daniel