c# - how to group by two left joins? -


i'm needing make 2 left joins , sum/count data these 2 left joins.

first tried 1 left join (valorefetuado). table may have data , if has data need sum it.

that's mi original query 1 left join , select generates (pretty , simple think)

var query = l in db.lancamentos                         join tl in db.tiposlancamentos on l.idtipolancamento equals tl.idtipolancamento                         join ve in db.valoresefetuados on l.idlancamento equals ve.idlancamento ve_leftjoin                         _ve in ve_leftjoin.defaultifempty()                      (l.excluido == false && l.idconta == idconta)                      group _ve new                     {                         tipolancamento = tl.descricao,                         datavencimento = l.datavencimento,                         idlancamento = l.idlancamento,                         idconta = l.idconta,                         valor = l.valor                     } grupo                     select new _lancamentogrid                     {                         idconta = grupo.key.idconta,                         idlancamento = grupo.key.idlancamento,                         descricao = grupo.key.tipolancamento,                         valor = grupo.key.valor,                         datavencimento = grupo.key.datavencimento,                         valorefetuado = grupo.sum(_vesum => _vesum.valor == null ? 0 : _vesum.valor),                     }; 

that select

select  [groupby1].[k1] [idlancamento],  [groupby1].[k2] [idconta],  [groupby1].[k5] [descricao],  [groupby1].[k3] [valor],  [groupby1].[k4] [datavencimento],  [groupby1].[a1] [c1] ( select      [filter2].[k1] [k1],      [filter2].[k2] [k2],      [filter2].[k3] [k3],      [filter2].[k4] [k4],      [filter2].[k5] [k5],      sum([filter2].[a1]) [a1]     ( select          [filter1].[idlancamento] [k1],          [filter1].[idconta] [k2],          [filter1].[valor] [k3],          [filter1].[datavencimento] [k4],          [filter1].[descricao] [k5],          case when ([extent3].[valor] null) cast(0 decimal(18)) else [extent3].[valor] end [a1]           (select [extent1].[idlancamento] [idlancamento], [extent1].[idconta] [idconta], [extent1].[valor] [valor], [extent1].[datavencimento] [datavencimento], [extent2].[descricao] [descricao]              [fin].[lancamento] [extent1]             inner join [fin].[tipolancamento] [extent2] on [extent1].[idtipolancamento] = [extent2].[idtipolancamento]             0 = [extent1].[excluido] ) [filter1]         left outer join [fin].[valorefetuado] [extent3] on [filter1].[idlancamento] = [extent3].[idlancamento]         [filter1].[idconta] = @p__linq__0     )  [filter2]     group [k1], [k2], [k3], [k4], [k5] )  [groupby1] 

there is, group , sum. problem is. when put new left join in query , group got demon query dosent work. big. , ineficient. in example

var query = l in db.lancamentos                         join tl in db.tiposlancamentos on l.idtipolancamento equals tl.idtipolancamento                         join ve in db.valoresefetuados on l.idlancamento equals ve.idlancamento ve_leftjoin                         _ve in ve_leftjoin.defaultifempty()                         join ld in db.lancamentosdocumentos on l.idlancamento equals ld.idlancamento ld_leftjoin                         _ld in ld_leftjoin.defaultifempty()                         (l.excluido == false && l.idconta == idconta)                      group new { _ve, _ld } new                     {                         tipolancamento = tl.descricao,                         datavencimento = l.datavencimento,                         idlancamento = l.idlancamento,                         idconta = l.idconta,                         valor = l.valor                     } grupo                     select new _lancamentogrid                     {                         idconta = grupo.key.idconta,                         idlancamento = grupo.key.idlancamento,                         descricao = grupo.key.tipolancamento,                         valor = grupo.key.valor,                         datavencimento = grupo.key.datavencimento,                         valorefetuado = grupo.sum(_vesum => _vesum._ve.valor == null ? 0 : _vesum._ve.valor),                         qtdcontadocumento = grupo.count(_ldcount => _ldcount._ld.idlancamento != null)                     }; 

this results in 1 ugly giant query simple dosent return asked for

select  [project4].[idlancamento] [idlancamento],  [project4].[idconta] [idconta],  [project4].[descricao] [descricao],  [project4].[valor] [valor],  [project4].[datavencimento] [datavencimento],  [project4].[c1] [c1],  [project4].[c2] [c2] ( select      [project3].[idlancamento] [idlancamento],      [project3].[idconta] [idconta],      [project3].[valor] [valor],      [project3].[datavencimento] [datavencimento],      [project3].[descricao] [descricao],      [project3].[c1] [c1],      (select          count(1) [a1]           (select [extent9].[idlancamento] [idlancamento1], [extent9].[idconta] [idconta], [extent9].[valor] [valor1], [extent9].[datavencimento] [datavencimento], [extent10].[descricao] [descricao]               [fin].[lancamento] [extent9]             inner join [fin].[tipolancamento] [extent10] on [extent9].[idtipolancamento] = [extent10].[idtipolancamento]             left outer join [fin].[valorefetuado] [extent11] on [extent9].[idlancamento] = [extent11].[idlancamento]             0 = [extent9].[excluido] ) [filter4]         inner join [fin].[lancamentodocumento] [extent12] on [filter4].[idlancamento1] = [extent12].[idlancamento]         ([filter4].[idconta] = @p__linq__0) , (([project3].[descricao] = [filter4].[descricao]) or (([project3].[descricao] null) , ([filter4].[descricao] null))) , ([project3].[datavencimento] = [filter4].[datavencimento]) , ([project3].[idlancamento] = [filter4].[idlancamento1]) , ([project3].[idconta] = [filter4].[idconta]) , ([project3].[valor] = [filter4].[valor1]) , ([extent12].[idlancamento] not null)) [c2]     ( select          [project2].[idlancamento] [idlancamento],          [project2].[idconta] [idconta],          [project2].[valor] [valor],          [project2].[datavencimento] [datavencimento],          [project2].[descricao] [descricao],          (select              sum([filter3].[a1]) [a1]             ( select                  case when ([extent7].[valor] null) cast(0 decimal(18)) else [extent7].[valor] end [a1]                    [fin].[lancamento] [extent5]                 inner join [fin].[tipolancamento] [extent6] on [extent5].[idtipolancamento] = [extent6].[idtipolancamento]                 left outer join [fin].[valorefetuado] [extent7] on [extent5].[idlancamento] = [extent7].[idlancamento]                 left outer join [fin].[lancamentodocumento] [extent8] on [extent5].[idlancamento] = [extent8].[idlancamento]                 (0 = [extent5].[excluido]) , ([extent5].[idconta] = @p__linq__0) , (([project2].[descricao] = [extent6].[descricao]) or (([project2].[descricao] null) , ([extent6].[descricao] null))) , ([project2].[datavencimento] = [extent5].[datavencimento]) , ([project2].[idlancamento] = [extent5].[idlancamento]) , ([project2].[idconta] = [extent5].[idconta]) , ([project2].[valor] = [extent5].[valor])             )  [filter3]) [c1]         ( select              [distinct1].[idlancamento] [idlancamento],              [distinct1].[idconta] [idconta],              [distinct1].[valor] [valor],              [distinct1].[datavencimento] [datavencimento],              [distinct1].[descricao] [descricao]             ( select distinct                  [filter1].[idlancamento2] [idlancamento],                  [filter1].[idconta] [idconta],                  [filter1].[valor2] [valor],                  [filter1].[datavencimento] [datavencimento],                  [filter1].[descricao] [descricao]                   (select [extent1].[idlancamento] [idlancamento2], [extent1].[idconta] [idconta], [extent1].[valor] [valor2], [extent1].[datavencimento] [datavencimento], [extent2].[descricao] [descricao]                       [fin].[lancamento] [extent1]                     inner join [fin].[tipolancamento] [extent2] on [extent1].[idtipolancamento] = [extent2].[idtipolancamento]                     left outer join [fin].[valorefetuado] [extent3] on [extent1].[idlancamento] = [extent3].[idlancamento]                     0 = [extent1].[excluido] ) [filter1]                 left outer join [fin].[lancamentodocumento] [extent4] on [filter1].[idlancamento2] = [extent4].[idlancamento]                 [filter1].[idconta] = @p__linq__0             )  [distinct1]         )  [project2]     )  [project3] )  [project4] 

the differences between 2 queries:

  • the second 1 has new left join _ld
  • the second has ... group new {_ve,_ld} ... instead of ... group _ve ...
  • in end make count operation thing wanna qtdcontadocumento = grupo.count(_ldcount => _ldcount._ld.idlancamento != null)

i think misunderstanding left joins or group in entity. can't hard make work right


Comments

Popular posts from this blog

c# - Operator '==' incompatible with operand types 'Guid' and 'Guid' using DynamicExpression.ParseLambda<T, bool> -