代码之家  ›  专栏  ›  技术社区  ›  Asdrubal Hernandez

Linq查询特定数组索引出错

  •  0
  • Asdrubal Hernandez  · 技术社区  · 2 年前

    我对linq中的这个查询有一个问题,我没有看到任何磨损,任何人都可以帮我!

    LINQ to Entities中不支持LINQ表达式节点类型“ArrayIndex”

     public List<FiltroItem> CargarFiltroValidacionInformacion(FiltroViewModel filtro, bool validarUsuario, List<decimal> estadosValidos)
        {
            var query = from ce in _contexto.Certificacion_MPP
                        where ce.CODENTIDAD.ToString() == Motor.Certificado.Entidad
                        select ce;
    
            if (validarUsuario)
                query = query.Where(x => x.USUARIOASIGNADO.Contains(Motor.Certificado.Usuario));
    
            if (filtro.CodEmpleado.HasValue)
                query = query.Where(x => x.CODEMPLEADO == filtro.CodEmpleado);
    
            if (estadosValidos.Any())
                query = query.Where(x => x.CODESTADOCERTIFICACION.ToString().Any(y => estadosValidos.Contains(y)));
    
            if (filtro.CodEstadoSolicitud.HasValue)
                query = query.Where(x => x.CODESTADOCERTIFICACION == filtro.CodEstadoSolicitud);
    
            if (filtro.FechaIniSolicitud.HasValue)
            {
                if (!filtro.FechaFinSolicitud.HasValue)
                    filtro.FechaFinSolicitud = new DateTime(DateTime.Now.Year + 1, 12, 31);
    
                query = query.Where(x => x.FECHACREACION >= filtro.FechaIniSolicitud && x.FECHACREACION <= filtro.FechaFinSolicitud);
            }
            else if (filtro.FechaFinSolicitud.HasValue)
            {
                filtro.FechaIniSolicitud = new DateTime(DateTime.Now.Year - 1, 1, 1);
                query = query.Where(x => x.FECHAFIN >= filtro.FechaIniSolicitud && x.FECHAFIN <= filtro.FechaFinSolicitud);
            }
    
            return query.Select(c => new FiltroItem
            {
                CodEmpleado = c.CODEMPLEADO,
                MotivoCertificacion = ((EnumMotivoCertificacion)c.CODMOTIVOCERTIFICACION).ToString(),
                Estado = ((EnumPPEstadoCertificacion)c.CODESTADOCERTIFICACION).ToString(),
                FechaSolicitud = c.FECHACREACION,
                CodCertificacion = c.CODCERTIFICACION,
                UsuarioCertificadoLab = c.USUARIOASIGNADO.Split('|')[0],
                UsuarioCertificadoSal = c.USUARIOASIGNADO.Split('|')[1],
            })
                .OrderBy(x => x.FechaSolicitud)
                .ToList();
        }
    
    1 回复  |  直到 2 年前
        1
  •  1
  •   John    2 年前

    问题不是LINQ本身,而是特定的LINQ提供程序。LINQ基本上是“语法糖”,具体的LINQ提供者可以将您的LINQ代码转换为对查询其支持的特定列表有用的内容。实体框架有其自己的LINQ提供程序,称为LINQ to Entities,该提供程序必须将LINQ代码转换为可以对底层数据库执行的SQL。这意味着某些在C中完全有效的代码无法在运行时执行,因为没有有效的SQL转换。在您的具体案例中,问题似乎出现在这里:

    UsuarioCertificadoLab = c.USUARIOASIGNADO.Split('|')[0],
    UsuarioCertificadoSal = c.USUARIOASIGNADO.Split('|')[1],
    

    根据错误消息,似乎 Split 部分操作可以完成,但对生成的数组进行索引无效。您必须找到其他方法来获取这些子字符串。大概 First Last 这行得通,或者你只需要把全文拉回来,在本地拆分。