Inquiridor
Como trabalhar com GroupBy em um IQueryable<>

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
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 -
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çãomatches = matches.GroupBy(x => x.Documento.DocumentoCorTitulo);- Editado Leonardo Lima quarta-feira, 1 de setembro de 2010 20:56
-
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 -
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
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 Datasourcevar 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); } }
-
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 -
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 rsrsMas eu quero aprender sim :P
-
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