我在LINQ中进行了一个复杂的查询,它在Visual Studio 2012的调试环境中工作正常。当我使用Visual Studio 2015使用相同的数据库执行相同的查询时,它会引发以下异常:
消息:没有se puede convertir el tipo 'System.Nullable`1 [[System.Decimal,mscorlib,Version = 4.0.0.0, Culture = neutral,PublicKeyToken = b77a5c561934e089]] al tipo 'System.Object的'。 LINQ to Entities独家赞美lacontraióndetipos deenumeraciónoprimitivos de EDM。
Google翻译为英语:
无法转换类型'System.Nullable`1 [[System.Decimal,mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089]]以输入'System.Object'。 LINQ to Entities仅支持枚举类型或EDM原语的转换。
这是表达式。解释起来相当复杂,但也许有些错误可以轻易看出:
Dim dsRiesgoDatosParte1 = listRiesgoEntities _
.Select(Function(r) New With {
.Id = r.IdRiesgo,
.Nombre = r.Nombre,
.Descripcion = r.Descripcion,
.Costo = r.Costo,
.CategoriaRiesgoNivel1 = r.IdCategoriaRiesgo1,
.CategoriaRiesgoNivel2 = r.IdCategoriaRiesgo2,
.CategoriaRiesgoNivel3 = r.IdCategoriaRiesgo3,
.IdNivelDatos = r.IdNivelDatos,
.IdOrganigrama = r.IdOrganigrama,
.Ponderacion = r.Ponderacion,
.Activo = r.Activo,
.Completo = r.Completo,
.ModificadaPorUsuarioControles = r.ModificadaPorUsuarioControles,
.ModificadaPorUsuarioTratamientos = r.ModificadaPorUsuarioTratamientos,
.Comentario = r.Comentario,
.ValidacionRiesgo = If(r.ValidacionRiesgo IsNot Nothing, r.ValidacionRiesgo, 0),
.ValoracionGlobalControlesValor = If(r.ValoracionControles > 0, r.ValoracionControles, CType(Nothing, String)),
.VariablesValoracionGlobalControl = r.DS_RiesgoVariablesValoracionGlobalControl _
.Where(Function(i) r.ValoracionControles > 0) _
.Select(Function(i) New With {
.IdRiesgo = i.IdRiesgo,
.IdVariableConfiguracion = i.IdVariableConfiguracion,
.tmpIdItem = If(i.IdVariableListaItem IsNot Nothing, i.IdVariableListaItem, -1),
.Valor = CType(i.Valor, String)
}),
.ValoracionGlobalTratamientosValor = If(r.ValoracionTratamientos > 0, r.ValoracionTratamientos, CType(Nothing, String)),
.VariablesValoracionGlobalTratamiento = r.DS_RiesgoVariablesValoracionGlobalTratamiento _
.Where(Function(i) r.ValoracionTratamientos > 0) _
.Select(Function(i) New With {
.IdRiesgo = i.IdRiesgo,
.IdVariableConfiguracion = i.IdVariableConfiguracion,
.tmpIdItem = If(i.IdVariableListaItem IsNot Nothing, i.IdVariableListaItem, 0),
.Valor = CType(i.Valor, String)
}),
.tmpArchivos = r.DS_Archivo.Select(Function(a) New DTOArchivo With {
.Id = a.IdArchivo,
.Nombre = a.Nombre
}),
.tmpResponsables = r.DS_Usuarios.Select(Function(u) New DTOResponsable With {
.Login = u.USR_Login
}),
.tmpControlesDatos = r.DS_ControlDato.Select(Function(c) New With {
.Id = c.IdControlDato,
.Nombre = c.Nombre,
.IdVariableConfiguracion = c.IdVariableConfiguracion,
.Comentario = c.Comentario,
.CostoAnual = c.CostoAnual,
.Ponderacion = c.Ponderacion,
.ModificadaPorUsuario = c.ModificadaPorUsuario,
.Valor = CType(c.Valor, String),
.tmpValor = c.Valor,
.TiposControles = c.DS_TipoControl.Select(Function(tc) New DTOTipoControl With {
.Id = tc.IdTipoControl,
.Nombre = tc.Nombre
})
}),
.NivelDato = New DTONivelDato With {
.Id = r.DS_NivelDatosFijo.IdNivelDato,
.Nombre = r.DS_NivelDatosFijo.Nombre,
.Ponderacion = r.DS_NivelDatosFijo.Ponderacion,
.IdNivelConfiguracion = r.DS_NivelDatosFijo.IdNivelConfiguracion,
.IdNivelPadre = r.DS_NivelDatosFijo.IdNivelPadre,
.IdEmpresa = r.DS_NivelDatosFijo.IdEmpresa,
.Activo = r.DS_NivelDatosFijo.Activo
}
}) _
.AsEnumerable
我试图将Select分成几个部分,但找不到问题。当我加入上一个查询的结果时抛出异常,这里是对dsRiesgosDatosParte1
的检查:
正如我所说,它在VS2012中工作得很好但在VS2015中却没有,所以LINQ必须有新功能。
问题是,LINQ从VS2012到VS2015的变化可能会影响执行结果?我无法找到为什么会发生这种情况。