Linq – Método Cast() 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 usar sus propiedades y atributos, y para que los elementos de colección resultante sean de un tipo de datos específico.

Ambiente

Sistema OperativoWindows Vista Ultimate + Sp1
Microsoft .NET Framework3.5
Microsoft Visual Studio2008 Version 9.0.21022.8 RTM

Deja un comentario