[Nota después de la respuesta: en realidad estoy consultando en objetos de memoria y es por eso que ToTraceString
no funciona. Añadí esto para ahorrarle al lector el tiempo potencial de leer mi larga publicación].Trace LINQ cuando se utilizan uniones
Estoy usando un comando ToTraceString
al intentar inspeccionar cómo terminan buscando mis consultas LINQ. Sin embargo, hoy mi consulta tiene un poco complicado, que implica una join
y, de repente, me sale este error al intentar efectuar el seguimiento de mi cadena:
No se puede convertir objeto de tipo 'd__7a`1 [EGSLanguageProviderShared.DTODataType] 'para escribir' System.Data.Objects.ObjectQuery '.
Mi consulta, y la posterior invocación de ToTraceString
es la siguiente (tenga en cuenta que se debe hacer referencia a System.Data.Entity para que esto funcione). Ambos objetos que estoy consultando (langDTs y langInstructionsAVDTs) son objetos de Entity Framework (.Net 3.5) de la misma base de datos. La cláusula My Where (== av.InstructionAVKey) usa una clase simple Value Collection, nada que ver allí.
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();
¿Alguna idea sobre cómo podría ver la traducción de LINQ de esta unión? :: -). Observé que System.Data.Objects tiene más tipos de consultas, pero no puedo obtener ninguno de los que parecen más relevantes para este caso, para que funcionen.
de editar posteriormente:
Como se recomienda, he intentado cambiar el IEnumerable en IQueryable pero que dio lugar a un error de compilación tipo de incompatibilidad :: - /.
Después de hacer una conversión explícita, que tiene el mismo error, pero en tiempo de ejecución (1 Unable to cast object of type '<DistinctIterator>d__7a1[EGSLanguageProviderShared.DTODataType]' to type 'System.Linq.IQueryable
[EGSLanguageProviderShared.DTODataType]''.)
código adicional: mis objetos langDTs y langInstructionsAVDTs son:
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());
Por lo tanto, estos objetos se consultan inmediatamente porque son Listas :: -). En cuanto a DTODataType y DTOInstructionActiveValueDataType, son simples Value Collection Classes, simplemente Public Properties, eso es todo.
incluso editar TARDE
puedan ser de interés que en su raíz, los objetos que estoy usando se declaran de hecho, como ObjectQuery de vuelta en la capa más profunda (Entity Framework):
public global::System.Data.Objects.ObjectQuery<instructions> instructions
Sin embargo, a medida que traigo los datos de la capa de acceso a datos, los convierto en objetos de transferencia de datos (las clases con prefijo DTO que siguen viendo), que son simples Value Collection Classes (un mapa de propiedad por propiedad de la entidad) Objetos que utilizo para mantener el Modelo de Datos completamente separado de e Ver y también para ejecutar cualquier postproceso de datos en el lado de la Presentación).
suelo usar LINQPAD para este propósito ... tiene una buena característica que hace esto ... (haz clic en el icono de lambda en el panel de resultados) –
mira mi edición - necesito un poco más de código en tu pregunta. –
Ver mi segunda respuesta. –