在VS2012中工作的LINQ表达式在VS2015中不起作用

时间:2017-06-27 14:03:43

标签: vb.net linq visual-studio-2012 visual-studio-2015

我在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的检查:

enter image description here

正如我所说,它在VS2012中工作得很好但在VS2015中却没有,所以LINQ必须有新功能。

问题是,LINQ从VS2012到VS2015的变化可能会影响执行结果?我无法找到为什么会发生这种情况。

0 个答案:

没有答案
相关问题