Usuário com melhor resposta
Problemas com Union

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 Snippetvar
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});
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 Snippetvar
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