none
Problemas com Union RRS feed

  • Pergunta

  • Olá

     

    estou tentando execultar o linq abaixo, porém mostra o seguinte erro "SqlException: All queries combined using a UNION, INTERSECT or EXCEPT operator must have an equal number of expressions in their target lists."

     

    alguém sabe o motivo?

     

    Obrigado.

     

    Code Snippet

    var cc = (from pro in PRODUTOs
    join obr in PRODUTOOBRIGATORIOs on pro.CODIGOPRODUTO equals obr.CODIGOPRODUTO
    join dis in DISTRITOs on obr.CODIGODISTRITO equals dis.CODIGODISTRITO
    join are in AREAATUACAOs on dis.CODIGODISTRITO equals are.CODIGODISTRITO
    where are.CODIGOAREAATUACAO == 84
    select new {CODIGOPRODUTO = pro.CODIGOPRODUTO,
    VISAOOBRIGATORIA =
    new bool?(true),
                VISIVEL =
    new bool?(false)} )
    .Union
    (
    from pro in PRODUTOs
    join ces in CESTAPRODUTOS on pro.CODIGOPRODUTO equals ces.CODIGOPRODUTO
    where ces.CODIGOAREAATUACAO == 84
    select new {CODIGOPRODUTO = pro.CODIGOPRODUTO,
    VISAOOBRIGATORIA =
    new bool?(false),
                VISIVEL =
    new bool?(false)} );

    var cc2 = (
    from pro in PRODUTOs
    join sap in PRODUTOSAPs on pro.CODIGOPRODUTO equals sap.CODIGOPRODUTO
    join prod in cc on pro.CODIGOPRODUTO equals prod.CODIGOPRODUTO into temp
    from t in temp.DefaultIfEmpty()
    where sap.CODIGOATIVO == 1
    select new {sap.CODIGOSAP,
                pro.CODIGOPRODUTO,
                pro.NOMEPRODUTO,
                VISAOOBRIGATORIA = t ==
    null ? false : t.VISAOOBRIGATORIA});

     

     

    quinta-feira, 29 de janeiro de 2009 19:54

Respostas

  • Marcos Aguiar Jr said:

    Olá

     

    estou tentando execultar o linq abaixo, porém mostra o seguinte erro "SqlException: All queries combined using a UNION, INTERSECT or EXCEPT operator must have an equal number of expressions in their target lists."

     

    alguém sabe o motivo?

     

    Obrigado.

     

    Code Snippet

    var cc = (from pro in PRODUTOs
    join obr in PRODUTOOBRIGATORIOs on pro.CODIGOPRODUTO equals obr.CODIGOPRODUTO
    join dis in DISTRITOs on obr.CODIGODISTRITO equals dis.CODIGODISTRITO
    join are in AREAATUACAOs on dis.CODIGODISTRITO equals are.CODIGODISTRITO
    where are.CODIGOAREAATUACAO == 84
    select new {CODIGOPRODUTO = pro.CODIGOPRODUTO,
    VISAOOBRIGATORIA =
    new bool?(true),
                VISIVEL =
    new bool?(false)} )
    .Union
    (
    from pro in PRODUTOs
    join ces in CESTAPRODUTOS on pro.CODIGOPRODUTO equals ces.CODIGOPRODUTO
    where ces.CODIGOAREAATUACAO == 84
    select new {CODIGOPRODUTO = pro.CODIGOPRODUTO,
    VISAOOBRIGATORIA =
    new bool?(false),
                VISIVEL =
    new bool?(false)} );

    var cc2 = (
    from pro in PRODUTOs
    join sap in PRODUTOSAPs on pro.CODIGOPRODUTO equals sap.CODIGOPRODUTO
    join prod in cc on pro.CODIGOPRODUTO equals prod.CODIGOPRODUTO into temp
    from t in temp.DefaultIfEmpty()
    where sap.CODIGOATIVO == 1
    select new {sap.CODIGOSAP,
                pro.CODIGOPRODUTO,
                pro.NOMEPRODUTO,
                VISAOOBRIGATORIA = t ==
    null ? false : t.VISAOOBRIGATORIA});


     



    /-------------------------------------------------------------*----------------------------------------------------/

    Pesquisando achei esse comentário em um forúm da MSDN em inglês.

    There is unfortunately a bug in LINQ to SQL whereby the duplicate-column optimization process fails to detect it is running within the context of a union.

    This is scheduled to be fixed in .NET 4.0. In the mean time for your example above I would suggest changing the second query to perform some server-based logic instead of one of the "false" statements to prevent the column from being duplicated, e.g. VISIVEL = new bool?(ces.CODIGOAREAATUACAO <> 84).


    Eu resolvi dessa forma mas nao sei se é a correta:

    var cc = (from pro in PRODUTOs  
    join obr in PRODUTOOBRIGATORIOs on pro.CODIGOPRODUTO equals obr.CODIGOPRODUTO  
    join dis in DISTRITOs on obr.CODIGODISTRITO equals dis.CODIGODISTRITO  
    join are in AREAATUACAOs on dis.CODIGODISTRITO equals are.CODIGODISTRITO  
    let VISAO = true 
    where are.CODIGOAREAATUACAO == 84  
    select new {  
                 CODIGOPRODUTO = pro.CODIGOPRODUTO,  
                 VISAOOBRIGATORIA = new bool?(true),  
                 VISIVEL = VISAO}).Union  
    ( from pro in PRODUTOs  
    join ces in CESTAPRODUTOS on pro.CODIGOPRODUTO equals ces.CODIGOPRODUTO  
    let VISAO = true 
    where ces.CODIGOAREAATUACAO == 84  
    select new {CODIGOPRODUTO = pro.CODIGOPRODUTO,  
                VISAOOBRIGATORIA = new bool?(false),  
                VISIVEL = VISAO 
    });  
     

    Obrigado.
    Marcos Antonio Aguiar Jr
    • Marcado como Resposta Marcos Aguiar Jr quinta-feira, 5 de fevereiro de 2009 17:57
    quinta-feira, 5 de fevereiro de 2009 17:56