none
convertir sql a linq RRS feed

  • Pregunta

  • Hola, por favor, tengo una consulta en sql con case when y quiero pasarlo a linq alguien me puede ayudar con esto? pongo el sql

    select '1111111111' as 'Campo 1',ven.VENNUMDOCREF as 'Campo 2' ,

    'Campo 3' = case 
                when isnull(ven.FICCODIGOLEGAL,'-1')='-1' then 
                    case  
                        when pac.LISCODIGOTIPODOCPAC = 'RUC' then '04'
                        when pac.LISCODIGOTIPODOCPAC = 'CED' then '05'  
                        when pac.LISCODIGOTIPODOCPAC = 'PAS' then '07'  
                        when pac.LISCODIGOTIPODOCPAC = 'COF' then '06' 
                    end
                else
                     case  
                        when fic.LISCODIGOTIPOIDEN = 'RUC' then '04'
                        when fic.LISCODIGOTIPOIDEN = 'CED' then '05'  
                        when fic.LISCODIGOTIPOIDEN = 'PAS' then '07'
                        when fic.LISCODIGOTIPOIDEN = 'COF' then '06'
                    end
                end,
    pac.PACDOCIDENTIFICACION as 'Campo 4', 

    etc.

    Muchas gracias


    diego

    viernes, 24 de junio de 2016 21:48

Respuestas

  • diegon1,

    Puedes utilizar el operador ternario condicional "?" para encaminar el flujo al valor:

    var data =	from t1 in db.Tabla1
    			join t2 in db.Tabl2 on t1.id equals t2.id
    			let CodigoLegal = t1.CodigoLegal == null ? 0 : 1
    			select new {	Campo1 = "1111111111", 
    							Campo2 = t1.VENNUMDOCREF, 
    							Campo3 =	CodigoLegal == 0 && t2.LISCODIGOTIPODOCPAC == 'RUC' ? "04" :
    									CodigoLegal == 0 && t2.LISCODIGOTIPODOCPAC == 'CED' ? "05" :
    									CodigoLegal == 1 && t3.LISCODIGOTIPODOCPAC == 'RUC' ? "04" : "05"										
    							Campo4 = t2.PACDOCIDENTIFICACION }


    sábado, 25 de junio de 2016 1:17
  • diegon1,

    El código que propuse menciona como afrontar tu caso, no pretendía darte una solución completa por lo extensa de tu consulta, toma los lineamientos del siguiente ejemplo y si tienes algún inconveniente te apoyamos. Nota como traducir una instrucción CASE de t-sql con un operador ternario:

    /*Consulta t-sql*/
    SELECT
             Campo1,
             CASE
                   WHEN Tipo = 'A' THEN 1
                   WHEN Tipo = 'B' THEN 2
                   WHEN Tipo = 'C' THEN 3        
             END,
             Campo3
    FROM
             ...

    Consulta LinQ

    from t in db.MiTabla
    select new { Campo1 = t.Campo1,
                 Campo2 = t.Tipo ==  "A" ? 1 :
                          t.Tipo ==  "B" ? 2 : 3,
                 Campo3 = t.Campo3 };

    Si tienes instrucciones CASE anidadas aplica de la misma manera según el ejemplo.

    sábado, 25 de junio de 2016 23:01

Todas las respuestas

  • diegon1,

    Puedes utilizar el operador ternario condicional "?" para encaminar el flujo al valor:

    var data =	from t1 in db.Tabla1
    			join t2 in db.Tabl2 on t1.id equals t2.id
    			let CodigoLegal = t1.CodigoLegal == null ? 0 : 1
    			select new {	Campo1 = "1111111111", 
    							Campo2 = t1.VENNUMDOCREF, 
    							Campo3 =	CodigoLegal == 0 && t2.LISCODIGOTIPODOCPAC == 'RUC' ? "04" :
    									CodigoLegal == 0 && t2.LISCODIGOTIPODOCPAC == 'CED' ? "05" :
    									CodigoLegal == 1 && t3.LISCODIGOTIPODOCPAC == 'RUC' ? "04" : "05"										
    							Campo4 = t2.PACDOCIDENTIFICACION }


    sábado, 25 de junio de 2016 1:17
  • Hola gracias por tu ayuda, mira, por el si hago otras preguntas de una tabla ejem:

    when pac.LISCODIGOTIPODOCPAC = 'RUC' then '04'
                        when pac.LISCODIGOTIPODOCPAC = 'CED' then '05'  
                        when pac.LISCODIGOTIPODOCPAC = 'PAS' then '07'  
                        when pac.LISCODIGOTIPODOCPAC = 'COF' then '06' 

    y para el no hago para otra tabla

    when fic.LISCODIGOTIPOIDEN = 'RUC' then '04'
                        when fic.LISCODIGOTIPOIDEN = 'CED' then '05'  
                        when fic.LISCODIGOTIPOIDEN = 'PAS' then '07'
                        when fic.LISCODIGOTIPOIDEN = 'COF' then '06'

    Creo yo no estas tomando en cuenta estas posibilidades

    Te adjunto toda mi consulta para que la revises

    select

    '1791949374001' as 'Campo 1',ven.VENNUMDOCREF as 'Campo 2' ,

    'Campo 3' = case

                when isnull(ven.FICCODIGOLEGAL,'-1')='-1' then

                    case 

                        when pac.LISCODIGOTIPODOCPAC = 'RUC' then '04'

                        when pac.LISCODIGOTIPODOCPAC = 'CED' then '05' 

                        when pac.LISCODIGOTIPODOCPAC = 'PAS' then '07' 

                        when pac.LISCODIGOTIPODOCPAC = 'COF' then '06'

                    end

                else

                     case 

                        when fic.LISCODIGOTIPOIDEN = 'RUC' then '04'

                        when fic.LISCODIGOTIPOIDEN = 'CED' then '05' 

                        when fic.LISCODIGOTIPOIDEN = 'PAS' then '07'

                        when fic.LISCODIGOTIPOIDEN = 'COF' then '06'

                    end

                end,

    pac.PACDOCIDENTIFICACION as 'Campo 4',

    'Campo 5' = case when isnull(ven.FICCODIGOLEGAL,'-1')='-1' then pac.pacapellidopaterno +' '+pac.PACAPELLIDOMATERNO+' '+pac.pacnombres else fic.ficnombre end,

    'Campo 6' = case when isnull(ven.FICCODIGOLEGAL,'-1')='-1' then pac.PACMAIL else fic.ficmail end,

    ven.VENFECHA as 'Campo 7',

    (ven.VENSUBTOTAL - ven.VENDESCUENTO) as 'Campo 8',

    ven.VENDESCUENTO as 'Campo 9','0' as 'Campo 10',

    ven.VENTOTAL as 'Campo 11',

    CASE

            WHEN ISNULL(detven.CATCODIGO,'1') = '1'

            THEN CONVERT(VARCHAR,max(detven.ARTCODIGO))+'-'+CONVERT(VARCHAR,MAX(detven.VENDETLINEA))

            ELSE CONVERT(VARCHAR,(SELECT CATARTCODIGOXMLARIES  FROM INV_CATEGORIA_TBL WHERE CATCODIGO=detven.CATCODIGO))+'-'+CONVERT(VARCHAR,MAX(detven.VENDETLINEA))--detven.CATCODIGO

    END as 'campo 12',

    CASE

            WHEN ISNULL(detven.CATCODIGO,'1') = '1'

            THEN max(detven.ARTCODIGO)

            ELSE (SELECT CATARTCODIGOXMLARIES  FROM INV_CATEGORIA_TBL WHERE CATCODIGO=detven.CATCODIGO)

    END as 'campo 13',

    detven.VENDETDESCRIPCION, --.ARTNOMBRECOMERCIAL as 'Campo 14', 

    CASE

            WHEN ISNULL(detven.CATCODIGO,'1') = '1'

            THEN SUM(detven.VENDETCANTIDAD)

            ELSE '1'

    END as 'Campo 15',

    SUM(detven.VENDETPRECIOUNITARIO) as 'Campo 16',

    SUM(detven.VENDETDESCUENTO) as 'Campo 17',

    SUM((detven.VENDETPRECIOUNITARIO * detven.VENDETCANTIDAD) - detven.VENDETDESCUENTO) as 'Campo 18',

    'Campo 19' = 2,

    'Campo 20' = case when SUM(detven.vendetiva) = 0 then '0' else '3' end,

    'Campo 21' = (SELECT PARVALORDEC FROM SEG_PARAMETROSCORPORATIVOS_TBL WHERE PARCODPARAM='PORCENTIVA'),

    SUM((detven.VENDETPRECIOUNITARIO * detven.VENDETCANTIDAD) - detven.VENDETDESCUENTO) as 'Campo 22',

    SUM(detven.VENDETIVA) as 'Campo 23',

    '001' as 'Campo 24',

    '00' + CAST(ven.PUNCODIGO as varchar(12)) as 'Campo 25',

    'Campo 26' = case when isnull(ven.FICCODIGOLEGAL,'-1')='-1' then ltrim(rtrim(pac.pacDireccion)) else ltrim(rtrim(fic.FICDIRECCION)) end

    from VEN_VENTADETALLE_TBL detven, INV_ARTICULO_TBL pro, VEN_VENTAS_TBL ven

    left join PED_PACIENTE_TBL pac on ven.PACCODIGO = pac.PACCODIGO

    left join ADM_FICHA_TBL fic on ven.FICCODIGOLEGAL = fic.ficcodigolegal

    where ven.VENNUMEROVENTA = detven.VENNUMEROVENTA and

    pro.ARTCODIGO = detven.ARTCODIGO and ven.VENNUMEROVENTA =80

    group by detven.VENDETDESCRIPCION, ven.VENNUMDOCREF, ven.FICCODIGOLEGAL, pac.LISCODIGOTIPODOCPAC,fic.LISCODIGOTIPOIDEN,

    pac.PACDOCIDENTIFICACION,

    pac.pacapellidopaterno,pac.PACAPELLIDOMATERNO,pac.pacnombres,fic.ficnombre,pac.PACMAIL,

    fic.ficmail,ven.VENFECHA,

    detven.VENDETDESCRIPCION,

    pac.pacDireccion,

    fic.FICDIRECCION,

    ven.PUNCODIGO,ven.VENSUBTOTAL,

    ven.VENDESCUENTO,ven.VENTOTAL,

    detven.VENDETDESCRIPCION,

    DETVEN.CATCODIGO, detven.VENDETLINEA

    order by detven.VENDETLINEA

    Muchas gracias por tu ayuda


    diego

    sábado, 25 de junio de 2016 22:28
  • diegon1,

    El código que propuse menciona como afrontar tu caso, no pretendía darte una solución completa por lo extensa de tu consulta, toma los lineamientos del siguiente ejemplo y si tienes algún inconveniente te apoyamos. Nota como traducir una instrucción CASE de t-sql con un operador ternario:

    /*Consulta t-sql*/
    SELECT
             Campo1,
             CASE
                   WHEN Tipo = 'A' THEN 1
                   WHEN Tipo = 'B' THEN 2
                   WHEN Tipo = 'C' THEN 3        
             END,
             Campo3
    FROM
             ...

    Consulta LinQ

    from t in db.MiTabla
    select new { Campo1 = t.Campo1,
                 Campo2 = t.Tipo ==  "A" ? 1 :
                          t.Tipo ==  "B" ? 2 : 3,
                 Campo3 = t.Campo3 };

    Si tienes instrucciones CASE anidadas aplica de la misma manera según el ejemplo.

    sábado, 25 de junio de 2016 23:01