Linq – Método Cast<TResult>() para listas non-generic
Trabajando con Linq me encontré el siguiente error al intentar hacer una consulta sobre dos colecciones utilizando la instrucción "Join":
The type of one of the expressions in the join clause is incorrect. Type inference failed in the call to 'Join'.
La instrucción que genera el error:
DbCommand Comando = obFactory.CreateCommand(); … foreach (var mapaEntity in from mapa in obEntityHelper join param in Comando.Parameters on mapa.Parametro equals param.ParameterName where !String.IsNullOrEmpty(mapa.Parametro) select mapa) |
Básicamente el problema se debe a que la colección "Parameters" de la clase "DbCommand" no implementa una interfaz genérica, en otras palabras es una "non-generic list", razón por lo cual no puede identificar el tipo correcto de cada uno de los elementos de la colección. Este problema se presenta en cualquier lista de elementos no específicos de tipo "Object".
La solución consiste en utilizar el método extendido "Cast< TResult >" para convertir los elementos de la lista a un tipo específico:
DbCommand Comando = obFactory.CreateCommand(); … foreach (var mapaEntity in from mapa in obEntityHelper join param in Comando.Parameters.Cast<DbParameter>() on mapa.Parametro equals param.ParameterName where !String.IsNullOrEmpty(mapa.Parametro) select mapa) |
De tal forma que dentro de la instrucción de consulta, el compilador pueda utilizar la clase específica para poder refernciar sus propiedades y atributos, además los elementos de la colección resultante serán de un tipo de datos específico.
| Ambiente |
| Sistema Operativo |
Windows Vista Ultimate + Sp1 |
| Microsoft .NET Framework |
3.5 |
| Microsoft Visual Studio |
2008 Version 9.0.21022.8 RTM |