[Примечание после ответа: я действительно запрашиваю объекты памяти, и поэтому 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, но это привело к ошибке компиляции несовместимости типов :: - /.
После выполнения явного приведения я получил ту же ошибку, но во время выполнения ( Невозможно преобразовать объект типа '
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, которые вы продолжаете видеть), которые являются простыми классами сбора значений (карта свойств объектов сущностей, которую я использую, чтобы полностью отделить модель данных от Просмотр, а также для выполнения любой пост-обработки данных на стороне представления).