LINQ to SQL查询+子查询

时间:2015-08-10 12:13:51

标签: c# linq

我得到了着名的“唯一原始类型或枚举类型......”错误,我找不到解决方案。

这是让我的头爆炸的代码(它是另一个LINQ代码中select的一部分):

Min = (from inddetails in EntitiesDB.ConfSet 
where (final.Max(x => x.hosp.Hos_NumOnc) > inddetails.Conf_Desde && final.Max(x => x.hosp.Hos_NumOnc) < inddetails.Conf_Hasta)
|| final.Max(x => x.hosp.Hos_NumOnc) > (from inddetails2 in EntitiesDB.ConfSet select inddetails2.Conf_Hasta).Max()
select inddetails.Conf_NumeroRegistros)

以下是最后更新所请求的完整代码(未更改):

var result = from indicadores in EntitiesDB.Catalogo_IndicadoresSet
                             join crit in EntitiesDB.Catalogo_CriteriosSet on indicadores.CodigoCriterio equals crit.CodigoCriterio
                             join dimen in EntitiesDB.Catalogo_DimensionSet on crit.CodigoDimension equals dimen.CodigoDimension
                             join grupo in EntitiesDB.Catalogo_GruposSet on dimen.CodigoGrupo equals grupo.CodigoGrupo
                             join indicador_resultado in EntitiesDB.Catalogo_Indicador_ResultadoSet.DefaultIfEmpty() on indicadores.CodigoIndicador equals indicador_resultado.CodigoIndicador /*into joined
                         from j in joined.DefaultIfEmpty()*/
                             join user in EntitiesDB.UsuariosSet on indicador_resultado.CodigoUsuario equals user.CodigoUsuario
                             join hosp in EntitiesDB.HospitalesSet on user.CodigoHospital equals hosp.CodigoHospital
                             join hosper in EntitiesDB.Rel_Hospital_PeriodoSet on hosp.CodigoHospital equals hosper.CodigoHospital
                             join period in EntitiesDB.PeriodosSet on hosper.CodigoPeriodo equals period.CodigoPeriodo
                             where period.CodigoPeriodo == periodos.CodigoPeriodo
                             group new { indicadores, hosper, hosp, grupo, crit, dimen, indicador_resultado, user, period } by new { hosper.CodigoPeriodo, hosp.CodigoHospital, grupo.CodigoGrupo, indicadores.CodigoIndicador, period.Per_Nombre, hosp.Hos_Nombre, hosp.Hos_NumeroOncologos, grupo.Gru_Descripcion, indicador_resultado.CodigoResultado, indicador_resultado.Resul_Completado, indicador_resultado.Resul_Numerador, indicador_resultado.Resul_Denominador, indicador_resultado.Resul_Valor, indicador_resultado.Resul_Objetivo, indicador_resultado.Resul_Variacion, indicador_resultado.Resul_Detalle, indicador_resultado.Resul_Fecha, indicadores.Ind_Descripcion, dimen.CodigoDimension, crit.CodigoCriterio } into final
                             orderby final.Key.CodigoPeriodo, final.Key.CodigoHospital, final.Key.CodigoGrupo
                             select new
                             {
                                 CodigoPeriodo = final.Key.CodigoPeriodo,
                                 NombrePeriodo = final.Key.Per_Nombre,
                                 CodigoHospital = final.Key.CodigoHospital,
                                 NombreHospital = final.Key.Hos_Nombre,
                                 NumeroOncologos = final.Key.Hos_NumeroOncologos),
                                 CodigoGrupo = final.Key.CodigoGrupo,
                                 NombreGrupo = final.Key.Gru_Descripcion,
                                 CodigoResultado = final.Max(x => x.indicador_resultado.CodigoResultado),
                                 Completado = final.Key.Resul_Completado,
                                 Numerador = final.Max(x => x.indicador_resultado.Resul_Numerador),
                                 Denominador = final.Max(x => x.indicador_resultado.Resul_Denominador),
                                 Valor = final.Max(x => x.indicador_resultado.Resul_Valor),
                                 Objetivo = final.Max(x => x.indicador_resultado.Resul_Objetivo),
                                 Variacion = final.Max(x => x.indicador_resultado.Resul_Variacion),
                                 Detalle = final.Key.Resul_Detalle,
                                 CodigoIndicador = final.Key.CodigoIndicador,
                                 NombreIndicador = final.Key.Ind_Descripcion,
                                 CodigoDimension = final.Max(x => x.dimen.CodigoDimension),
                                 CodigoCriterio = final.Max(x => x.crit.CodigoCriterio),
                                 CasosMinimos = (from inddetalle in EntitiesDB.Configuracion_IndicadoresDetalleSet
                                                 where (final.Key.Hos_NumeroOncologos > inddetalle.Conf_Desde && final.Key.Hos_NumeroOncologos < inddetalle.Conf_Hasta)
                                                     || final.Key.Hos_NumeroOncologos) > valorMaximo
                                                 select inddetalle.Conf_NumeroRegistros)

                             };

1 个答案:

答案 0 :(得分:4)

从查询中取出最大值:

var finalMax = final.Max(x => x.hosp.Hos_NumOnc);

Min = (from inddetails in EntitiesDB.ConfSet 
where (finalMax > inddetails.Conf_Desde 
    && finalMax < inddetails.Conf_Hasta)
|| finalMax > (from inddetails2 in EntitiesDB.ConfSet select inddetails2.Conf_Hasta).Max()
select inddetails.Conf_NumeroRegistros);

final是(非原始)对象的集合,没有SQL等价物。这样做也更有效率。