none
Como trabalhar com GroupBy em um IQueryable<> RRS feed

  • Pergunta

  • Olá pessoal,

    Estou precisando de uma ajuda com LINQ... tenho a seguinte consulta dinâmica:

    IQueryable<DocumentosContrato> matches = DataContext.DocumentosContratos;
    
    long idDocumentoContrato = 0;
    if (long.TryParse(txtDocumentoContratoNumero.Text, out idDocumentoContrato))
    {
    <span style="white-space:pre">	</span>matches = matches.Where(q => q.DocumentoContratoId == idDocumentoContrato);
    }
    
    List<DocumentosContrato> queryResult = matches.ToList<DocumentosContrato>();
    

    O que eu preciso fazer agora é agrupar maches, 

    tentei fazendo matches = matches.GroupBy(q => q.Documento.DocumentoCorTitulo);  

    mas recebo erro de casting, então gostaria de saber como recuperar uma lista de DocumentosContrato de matches.GroupBy(q => q.Documento.DocumentoCorTitulo) andei vendo uns exemplos na web mas não consegui chegar no resultado que eu quero...

     

    Aguardo contato,

     

    Muito Obrigado

    Att.
    Leonardo Lima

    quarta-feira, 1 de setembro de 2010 14:50

Todas as Respostas

  • Leonardo,

    Basicamente é isso aí que você tentou mesmo... Qual é exatamente o erro de cast que você está recebendo?


    André Alves de Lima
    Visite o meu site: http://andrealveslima.spaces.live.com
    Me siga no Twitter: @andrealveslima
    quarta-feira, 1 de setembro de 2010 19:52
    Moderador
  • Esse erro de compilação....

     

    Error 1 Cannot implicitly convert type 'System.Linq.IQueryable<System.Linq.IGrouping<string,Contratos.Dados.DocumentosContrato>>' to 'System.Linq.IQueryable<Contratos.Dados.DocumentosContrato>'. An explicit conversion exists (are you missing a cast?) D:\***\***\Site\GerenciarDocumentos\Documento_Listagem.aspx.cs 56 23 Site


    Para esta ação
    matches = matches.GroupBy(x => x.Documento.DocumentoCorTitulo);

     

    • Editado Leonardo Lima quarta-feira, 1 de setembro de 2010 20:56
    quarta-feira, 1 de setembro de 2010 20:34
  • Leonardo,

    Ahhh, entendi... Acredito que seja porque você está armazenando o resultado na própria variável matches... Tente criar outra variável para armazenar o resultado agrupado:

    var groupedMatches = matches.GroupBy(x => x.Documento.DocumentoCorTitulo);


    André Alves de Lima
    Visite o meu site: http://andrealveslima.spaces.live.com
    Me siga no Twitter: @andrealveslima
    quarta-feira, 1 de setembro de 2010 20:47
    Moderador
  • Então... já vi essa estratégia no 101 LINQ Examples... 

    E tbm neste post está mais parecido do que eu preciso, lá bem no final 

    http://www.codeproject.com/Articles/35667/How-to-Use-LINQ-GroupBy.aspx

     

     

    var grpOrderedFirstLetter = empList.GroupBy(employees => 
      new String(employees.FName[0], 1)).OrderBy(employees => 
      employees.Key.ToString());; 
    
    foreach (var employee in grpOrderedFirstLetter) 
    { 
      Console.WriteLine("\n'Employees having First Letter {0}':", 
               employee.Key.ToString()); 
      foreach (var empl in employee) 
      { 
        Console.WriteLine(empl.FName); 
      } 
    } 
    
    
    No meu caso eu precisava evitar esses foreach, e já retornar os objetos DocumentosContrato em um IQueryable para continuar com a query dinâmica, ou mesmo se for no final já jogar isso em um Datasource

     

    quarta-feira, 1 de setembro de 2010 21:03
  • Leonardo,

    Então... Agora fiquei perdido... Você já conseguiu fazer o group by? Você pode fazer um ToList do resultado ou até mesmo setar o resultado como DataSource de uma grid sem problemas...


    André Alves de Lima
    Visite o meu site: http://andrealveslima.spaces.live.com
    Me siga no Twitter: @andrealveslima
    quinta-feira, 2 de setembro de 2010 11:11
    Moderador
  • Olá Andre,

     

    Desculpe a confusão, não eu não consegui fazer o GroupBy ainda, eu apenas citei o exemplo do 101 LINQ Examples para o GroupBy...

    Para falar a verdade eu executei o exemplo, com os meus objetos... mas não chegou no resultado que eu queria... 

    Para falar mais a verdade eu nem entendi como esse GroupBy funciona de verdade, rsrs atualmente deixei o projeto sem esse GroupBy pois era uma perfumaria que eu iria fazer rsrs

     

    Mas eu quero aprender sim :P

    quinta-feira, 2 de setembro de 2010 13:48
  • Leonardo,

    O GroupBy do LINQ tem a mesma utilidade do Group By do SQL... Ele serve para agrupar valores por uma determinada chave...

    Imagine que você tenha uma lista de despesas por departamento e tipo de despesa... Aí você quer exibir as despesas agrupadas por departamento em um grid e as despesas agrupadas por tipo em um outro grid... Você poderia fazer isso seguindo a lógica abaixo:

        public class MinhaEstrutura
        {
          public string Departamento { get; set; }
          public string DescricaoDespesa { get; set; }
          public double Despesa { get; set; }
        }
        private void ExemploLinqGroupBy()
        {
          List<MinhaEstrutura> objetos = new List<MinhaEstrutura>();
          objetos.Add(new MinhaEstrutura() { Departamento = "Financeiro", DescricaoDespesa = "Energia", Despesa = 100 });
          objetos.Add(new MinhaEstrutura() { Departamento = "Financeiro", DescricaoDespesa = "Agua", Despesa = 250 });
          objetos.Add(new MinhaEstrutura() { Departamento = "Contabil", DescricaoDespesa = "Energia", Despesa = 50 });
          objetos.Add(new MinhaEstrutura() { Departamento = "Contabil", DescricaoDespesa = "Agua", Despesa = 60 });
          objetos.Add(new MinhaEstrutura() { Departamento = "RH", DescricaoDespesa = "Equipamentos", Despesa = 90 });
    
          var despesasPorDepto = from o in objetos
                      group o by o.Departamento into d
                      select new
                      {
                        Departamento = d.Key,
                        Despesas = d.Sum(a => a.Despesa)
                      };
    
          foreach (var despesa in despesasPorDepto)
            MessageBox.Show(string.Format("Departamento {0} gastou {1}", despesa.Departamento, despesa.Despesas));
    
          var despesasPorTipo = from o in objetos
                     group o by o.DescricaoDespesa into d
                     select new
                     {
                       TipoDespesa = d.Key,
                       Despesas = d.Sum(a => a.Despesa)
                     };
    
          foreach (var despesa in despesasPorTipo)
            MessageBox.Show(string.Format("Despesa tipo {0} totalizou {1}", despesa.TipoDespesa, despesa.Despesas));
        }
    
    

    Espero que tenha dado pra entender a funcionalidade...


    André Alves de Lima
    Visite o meu site: http://andrealveslima.spaces.live.com
    Me siga no Twitter: @andrealveslima
    sábado, 4 de setembro de 2010 01:23
    Moderador