Como trabalhar com GroupBy em um IQueryable<>
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...
quarta-feira, 1 de setembro de 2010 14:50
Basicamente é isso aí que você tentou mesmo... Qual é exatamente o erro de cast que você está recebendo?
quarta-feira, 1 de setembro de 2010 19:52
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
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);
quarta-feira, 1 de setembro de 2010 20:47
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
new String(employees.FName[0], 1)).OrderBy(employees =>
employees.Key.ToString());;
Console.WriteLine("\n'Employees having First Letter {0}':",
employee.Key.ToString());
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
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...
quinta-feira, 2 de setembro de 2010 11:11
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
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
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
TipoDespesa = d.Key,
foreach (var despesa in despesasPorTipo)
MessageBox.Show(string.Format("Despesa tipo {0} totalizou {1}", despesa.TipoDespesa, despesa.Despesas));