Отслеживать LINQ при объединении использовал

[Примечание после ответа: я действительно запрашиваю объекты памяти, и поэтому ToTraceString не работает. Я добавил это, чтобы сэкономить потенциальному читателю время на чтение моего длинного сообщения].

Я использую команду ToTraceString , когда пытаюсь проверить, как в итоге выглядят мои запросы LINQ. Однако сегодня мой запрос стал немного сложнее, включая join , и внезапно я получаю эту ошибку, когда пытаюсь отследить мою строку:

Невозможно привести объект типа 'd__7a`1 [EGSLanguageProviderShared.DTODataType] »для ввода« System.Data.Objects.ObjectQuery ».

Мой запрос, и последующий вызов ToTraceString выглядит следующим образом (обратите внимание, что для этого необходимо указать System.Data.Entity). Оба объекта, которые я запрашиваю (langDTs и langInstructionsAVDTs), являются объектами Entity Framework (.Net 3.5) из одной базы данных. My Where Clause (== av.InstructionAVKey) использует простой класс сбора значений, там ничего не видно.

      IEnumerable<DTODataType> dts = 
          (from langDT in langDTs 
          join langIAVDT in langInstructionsAVDTs 
          on langDT.DataTypeKey equals langIAVDT.DataTypeKey 
          where langIAVDT.InstructionAVKey == av.InstructionAVKey 
          select langDT).Distinct();
      var sql = ((System.Data.Objects.ObjectQuery)dts).ToTraceString();

Есть идеи, как я могу увидеть LINQ-перевод этого соединения? :: -). Я заметил, что в System.Data.Objects есть больше типов запросов, но я не могу заставить работать ни один из тех, которые кажутся более подходящими для этого случая.

ПОЗДНЕЕ РЕДАКТИРОВАНИЕ:

Как вы рекомендовали, я попробовал изменение IEnumerable на IQueryable, но это привело к ошибке компиляции несовместимости типов :: - /.

После выполнения явного приведения я получил ту же ошибку, но во время выполнения ( Невозможно преобразовать объект типа ' d__7a1 [EGSLanguageProviderShared.DTODataType]' в тип 'System.Linq.IQueryable 1 [EGSLanguageProviderShared.DTODataType]. : мои объекты langDT и langInstructionsAVDT:

List<DTOInstructionActiveValueDataType> langInstructionsAVDTs = CurrentLPInstructionManager.GetInstructionsActiveValuesDataTypes((from avKey in langInstructionsAVs select avKey.InstructionAVKey).Distinct().ToArray());

List<DTODataType> langDTs = _LPDataTypeManager.GetDataTypes((from dt in langInstructionsAVDTs orderby dt.DataTypeKey select dt.DataTypeKey).Distinct().ToArray());

Итак, эти объекты действительно запрашиваются немедленно, потому что они являются списками :: -). Что касается DTODataType и DTOInstructionActiveValueDataType, они представляют собой простые классы коллекции значений, просто общедоступные свойства и все.

ДАЖЕ ПОЗЖЕ РЕДАКТИРОВАТЬ

Может быть интересно, что в их корне объекты, которые я использую, действительно объявлены как ObjectQuery на самом глубоком уровне (Entity Framework):

public global::System.Data.Objects.ObjectQuery<instructions> instructions

Однако, когда я привожу данные из на уровне доступа к данным, Я конвертирую их в объекты передачи данных (классы с префиксом DTO, которые вы продолжаете видеть), которые являются простыми классами сбора значений (карта свойств объектов сущностей, которую я использую, чтобы полностью отделить модель данных от Просмотр, а также для выполнения любой пост-обработки данных на стороне представления).

5
задан Axonn 14 February 2011 в 16:57
поделиться