none
Sintax Issue - Group By RRS feed

  • Pergunta

  • Hi,

    I need to convert the follow T-Sql to Linq:

    Select f.FamiliaID,
              l.Clienteid,
              l.AreaAtuacaoID,
              f.DescricaoFamilia  as DescFamilia,
              Sum(l.Quantidade  * p.FatorConversao) as Quantidade
      from Leitura l
      Inner join Produto p on p.ProdutoID = l.ProdutoID
      Inner join Familia f on p.FamiliaID = f.FamiliaID
      group by f.FamiliaID,
                    l.Clienteid,
                    l.AreaAtuacaoID,
                    f.DescricaoFamilia

    In the conversion, the sintax works fines, just  value of 'Quantidade' is not the correctly.

    var query =

    from l in Leitura
    join p in Produto on l.ProdutoID equals p.ProdutoID
    join f in Familia on p.FamiliaID equals f.FamiliaID
    group l by new
    {
    f.FamiliaID,
    l.ClienteID,
    l.AreaAtuacaoID,
    f.DescricaoFamilia
    } into g 
    select new 
    {
        FamiliaId = g.Key.FamiliaID,
        ClienteId = g.Key.ClienteID,
        AreaAtuacaoId = g.Key.AreaAtuacaoID,
        DescricaoFamilia = g.Key.DescricaoFamilia,
        Quantidade = g.Sum(q => q.Quantidade ) 
    }

    How can I multiply the value q.Quantidade with p.FatorConversao?

    Thanks in advance.

    quarta-feira, 15 de fevereiro de 2012 00:07

Respostas

  • Olá Thiago,

    Dei uma pesquisa e me parece que essa solução funcionará:

    var query =
    from i in 
    (from l in Leitura
    join p in Produto on l.ProdutoID equals p.ProdutoID
    join f in Familia on p.FamiliaID equals f.FamiliaID
    select new
    {f.FamiliaID,
    l.ClienteID,
    l.AreaAtuacaoID,
    f.DescricaoFamilia,
    q.Quantidade,
    p.FatorConversao})
    group i by new { i.FamiliaID, i.ClienteID, i.AreaAtuacaoID, i.DescricaoFamilia } 
    into g
    select new { FamiliaId = g.Key.FamiliaID, ClienteId = g.Key.ClienteID, AreaAtuacaoId = g.Key.AreaAtuacaoID, DescricaoFamilia = g.Key.DescricaoFamilia, Quantidade = g.Sum(q => (i.Quantidade * i.FatorConversao)}

    Vamos testar?

    []s!

    Referência: http://social.msdn.microsoft.com/forums/en-US/linqprojectgeneral/thread/54f6ac70-e74c-4d9d-a9ee-6373714c0755/


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique

    • Marcado como Resposta Thiago Grandesso quarta-feira, 15 de fevereiro de 2012 11:45
    quarta-feira, 15 de fevereiro de 2012 11:07
    Moderador

Todas as Respostas

  • Olá Thiago,

    Vc tentou fazer assim:

    var query = from l in Leitura join p in Produto on l.ProdutoID equals p.ProdutoID join f in Familia on p.FamiliaID equals f.FamiliaID group l by new { f.FamiliaID, l.ClienteID, l.AreaAtuacaoID, f.DescricaoFamilia } into g select new { FamiliaId = g.Key.FamiliaID, ClienteId = g.Key.ClienteID, AreaAtuacaoId = g.Key.AreaAtuacaoID, DescricaoFamilia = g.Key.DescricaoFamilia, Quantidade = g.Sum(q => (q.Quantidade * p.FatorConversao)) }

    Queries mais complexas vc pode testar com o LinqPad.

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique

    quarta-feira, 15 de fevereiro de 2012 01:32
    Moderador
  • Obrigado pelo feedback amigo.

    Ja havia tentado desta maneira, no próprio LinqPad, porém ele não reconhece o "p" que antecede FatorConversao.

    Também não posso adicionar o campo FatorConversao ao GroupBy, senão modificará o agrupamento.  


    quarta-feira, 15 de fevereiro de 2012 10:14
  • Olá Thiago,

    Dei uma pesquisa e me parece que essa solução funcionará:

    var query =
    from i in 
    (from l in Leitura
    join p in Produto on l.ProdutoID equals p.ProdutoID
    join f in Familia on p.FamiliaID equals f.FamiliaID
    select new
    {f.FamiliaID,
    l.ClienteID,
    l.AreaAtuacaoID,
    f.DescricaoFamilia,
    q.Quantidade,
    p.FatorConversao})
    group i by new { i.FamiliaID, i.ClienteID, i.AreaAtuacaoID, i.DescricaoFamilia } 
    into g
    select new { FamiliaId = g.Key.FamiliaID, ClienteId = g.Key.ClienteID, AreaAtuacaoId = g.Key.AreaAtuacaoID, DescricaoFamilia = g.Key.DescricaoFamilia, Quantidade = g.Sum(q => (i.Quantidade * i.FatorConversao)}

    Vamos testar?

    []s!

    Referência: http://social.msdn.microsoft.com/forums/en-US/linqprojectgeneral/thread/54f6ac70-e74c-4d9d-a9ee-6373714c0755/


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique

    • Marcado como Resposta Thiago Grandesso quarta-feira, 15 de fevereiro de 2012 11:45
    quarta-feira, 15 de fevereiro de 2012 11:07
    Moderador
  • Fernando funcionou corretamente!

    Obrigado pela ajuda,

    []´s

    quarta-feira, 15 de fevereiro de 2012 11:51
  • Ai sim! :)

    #tamoJunto!

    O que precisar é só falar!

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique

    quarta-feira, 15 de fevereiro de 2012 12:06
    Moderador
  • Agora a coisa complicou um pouco.

    A partir dos resultados retornados na query acima, terei que usá-los como um SubSelect From.

    Eis o Sql principal:

    Select tabela.DescFamilia,
              tabela.Quantidade as Quantidade, 
              he.EstoqueFinal as EstoqueFinal 
      from (
            SUBSELECT
              ) tabela
       Left join HistoricoEstoque he on he.FamiliaID = tabela.FamiliaID 
                                    and he.ClienteID = tabela.Clienteid 
                                    and he.AreaAtuacaoID = tabela.AreaAtuacaoID 
                                    and he.Ano = 2011 
                                    and he.Mes = 2 
       Where tabela.Clienteid = 'x' 
         and tabela.AreaAtuacaoID = 'x' 
       group by tabela.DescFamilia 
       order by tabela.DescFamilia

    A sintaxe esta funcionando e retornando dois campos dos tres necessarios!

    from t in 
    (
      from i in 
      (
    from l in Leitura
    join p in Produto on l.ProdutoID equals p.ProdutoID
    join f in Familia on p.FamiliaID equals f.FamiliaID
    select new
    {
     f.FamiliaID,
     l.ClienteID,
     l.AreaAtuacaoID,
     f.DescricaoFamilia,
     l.Quantidade,
     p.FatorConversao
    }
      )
      group i by new 
      { 
    i.FamiliaID, 
    i.ClienteID, 
    i.AreaAtuacaoID, 
    i.DescricaoFamilia 
      } 
      into g 
      select new 
      { 
    FamiliaID = g.Key.FamiliaID, 
    ClienteID = g.Key.ClienteID, 
    AreaAtuacaoID = g.Key.AreaAtuacaoID, 
    DescricaoFamilia = g.Key.DescricaoFamilia, 
    Quantidade = g.Sum(q => (q.Quantidade * q.FatorConversao))
      }
    )
    join he in HistoricoEstoque on (t.FamiliaID +  t.ClienteID + t.AreaAtuacaoID) equals (he.FamiliaID + he.ClienteID + he.AreaAtuacaoID) into joined
    where t.ClienteID == "x" 
     && t.AreaAtuacaoID == x 
    from x in joined.DefaultIfEmpty()
    group x by t.DescricaoFamilia into a
    select new
    {
        DescricaoFamilia = a.Key,
        EstoqueFinal = a.Sum(e => e.EstoqueFinal) 
    }

    Só nao e possivel fazer a soma da Quantidade, que por sua vez, é um dos campos contidos no SubSelect. Se pudesse acessá-la conseguiria fazer a soma e retornar o resultado agrupado corretamente, entretanto não consigo "enxergá-la" nesse ultimo select.

    Obrigado!

    quarta-feira, 15 de fevereiro de 2012 15:36
  • Problema resolvido com a adição do campo t.Quantidade, no Group by.

    A sintaxe ficou assim:

    var query =
    from t in 
    (
      from i in 
      (
    from l in Leitura
    join p in Produto on l.ProdutoID equals p.ProdutoID
    join f in Familia on p.FamiliaID equals f.FamiliaID
    select new
    {
     f.FamiliaID,
     l.ClienteID,
     l.AreaAtuacaoID,
     f.DescricaoFamilia,
     l.Quantidade,
     p.FatorConversao
    }
      )
      group i by new 
      { 
    i.FamiliaID, 
    i.ClienteID, 
    i.AreaAtuacaoID, 
    i.DescricaoFamilia 
      } 
      into g 
      select new 
      { 
    FamiliaID = g.Key.FamiliaID, 
    ClienteID = g.Key.ClienteID, 
    AreaAtuacaoID = g.Key.AreaAtuacaoID, 
    DescricaoFamilia = g.Key.DescricaoFamilia, 
    Quantidade = g.Sum(q => (q.Quantidade * q.FatorConversao))
      }
    )
    join he in HistoricoEstoque on (t.FamiliaID +  t.ClienteID + t.AreaAtuacaoID) equals (he.FamiliaID + he.ClienteID + he.AreaAtuacaoID) into joined
    where t.ClienteID == "x" 
     && t.AreaAtuacaoID == x 
    from x in joined.DefaultIfEmpty()
    group x by new
    {
    t.DescricaoFamilia,
    t.Quantidade

    into a
    orderby a.Key.DescricaoFamilia
    select new
    {
    DescricaoFamilia = a.Key.DescricaoFamilia,
    Quantidade = a.Sum(q => a.Key.Quantidade),
    EstoqueFinal = a.Sum(e => e.EstoqueFinal) ?? 0
    };

    Mais uma vez obrigado ao amigo Fernando que deu uma luz para a solução!

    []´s

    Thiago


    quarta-feira, 15 de fevereiro de 2012 16:14