2009-05-06 1 views
1

Скажем, я создать два набора кортежей, как так:Работа с анонимными типами с Linq в 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 

Теперь я хочу, чтобы выполнить набор операций на этих двух списков, как так:

Dim loTupleSetDifference = loTupleKeys.Except(loTupleExistingKeys) 

Очевидно, Linq не может выполнить компаратор на множествах, если он не знает, что множества имеют единые определения, так что это даст мне эту ошибку сборки:

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

Как я могу работать с объявлением этих наборов, чтобы сделать их сеткой? (Не так много удачи на Google)

[Редактировать] все еще получаю ту же ошибку компиляции:

'*** 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) 

Ошибка здесь:

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>)'.

ответ

5

Если анонимные типы имеют одинаковые имена свойств с одинаковыми типами в s то они должны быть одного и того же типа (и, следовательно, совместимы).

EDIT: на основании комментариев и обновленного вопроса, я подозреваю, что бит, который вам не хватает, - это способность указывать свойства в анонимных типах. Изменить это:

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

в это:

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

До тех пор, как типы прав, вы можете тогда все будет в порядке, не больше работы.

+0

Ах. Я внес изменения в имена столбцов выше. Это должна быть проблема - имена различаются? Как я могу это исправить? – Daniel

+1

Использовать те же самые имена :) –

+0

Я бы хотел, но, к сожалению, наши администраторы баз данных решили не согласовывать имена столбцов с теми же соглашениями об именах, которые мы используем для кода. Один набор данных состоит из набора результатов хранимой процедуры, другой - список объектов. Есть ли простой способ изменить или игнорировать имена или мне придется их скопировать в равномерно названные наборы данных? – Daniel

Смежные вопросы