GROUP SUM ORDER BY LINQ

MAXCIM 17/11/2014 20:37:51
#442579
Olá amigos, tudo bem?

tenho um ilist,
com a seguinte estrutura:
ID_CLI,
Cliente e
valor

desejo usar o LINQ para :
agrupar pelo ID_CLi,
Somar o valor e
ordenar pela Soma desceding .

desejo fazer um for next com ID_CLI, Cliente e soma(valor) agrupado.

montei esse Link, mas tem algum erro, o valor não confere, se alguém poder verificar qual a melhor forma de faze-lo.
Dim Linq2 = From t1 In _ilist_ItensPed
Group t1 By t1.ID_CLI, t1.Cliente Into Group
Order By Group.Sum(Function(p) p.Vlr_Total) Descending
Select New With {
.idcli = ID_CLI,
.name = cliente,
.v = Group.Sum(Function(p) p.Vlr_Total),
.count = Group.Count}

FILMAN 18/11/2014 00:13:56
#442587
Resposta escolhida
Aparentemente esta certo, porém esse count no final da expressão que deve estar te atrapalhando.

Crie uma tela igual a essa m anexo
no evento click do botão coloque o código abaixo

        Dim lista As New List(Of ItensPed)()

lista.Add(New ItensPed() With {.ID_CLI = 1, .Cliente = [Ô]NOME PARA TESTE 1[Ô], .Valor = 1})
lista.Add(New ItensPed() With {.ID_CLI = 2, .Cliente = [Ô]NOME PARA TESTE 2[Ô], .Valor = 12})
lista.Add(New ItensPed() With {.ID_CLI = 3, .Cliente = [Ô]NOME PARA TESTE 3[Ô], .Valor = 13})
lista.Add(New ItensPed() With {.ID_CLI = 4, .Cliente = [Ô]NOME PARA TESTE 4[Ô], .Valor = 14})
lista.Add(New ItensPed() With {.ID_CLI = 5, .Cliente = [Ô]NOME PARA TESTE 5[Ô], .Valor = 15})
lista.Add(New ItensPed() With {.ID_CLI = 6, .Cliente = [Ô]NOME PARA TESTE 6[Ô], .Valor = 16})
lista.Add(New ItensPed() With {.ID_CLI = 7, .Cliente = [Ô]NOME PARA TESTE 7[Ô], .Valor = 17})
lista.Add(New ItensPed() With {.ID_CLI = 8, .Cliente = [Ô]NOME PARA TESTE 8[Ô], .Valor = 18})
lista.Add(New ItensPed() With {.ID_CLI = 9, .Cliente = [Ô]NOME PARA TESTE 9[Ô], .Valor = 19})
lista.Add(New ItensPed() With {.ID_CLI = 1, .Cliente = [Ô]NOME PARA TESTE 1[Ô], .Valor = 21.45})
lista.Add(New ItensPed() With {.ID_CLI = 2, .Cliente = [Ô]NOME PARA TESTE 2[Ô], .Valor = 17.58})
lista.Add(New ItensPed() With {.ID_CLI = 3, .Cliente = [Ô]NOME PARA TESTE 3[Ô], .Valor = 118})
lista.Add(New ItensPed() With {.ID_CLI = 4, .Cliente = [Ô]NOME PARA TESTE 4[Ô], .Valor = 14.59})
lista.Add(New ItensPed() With {.ID_CLI = 5, .Cliente = [Ô]NOME PARA TESTE 5[Ô], .Valor = 145.59})
lista.Add(New ItensPed() With {.ID_CLI = 6, .Cliente = [Ô]NOME PARA TESTE 6[Ô], .Valor = 18.96})
lista.Add(New ItensPed() With {.ID_CLI = 7, .Cliente = [Ô]NOME PARA TESTE 7[Ô], .Valor = 15.01})
lista.Add(New ItensPed() With {.ID_CLI = 8, .Cliente = [Ô]NOME PARA TESTE 8[Ô], .Valor = 19.99})
lista.Add(New ItensPed() With {.ID_CLI = 9, .Cliente = [Ô]NOME PARA TESTE 9[Ô], .Valor = 114.54})

Dim MyList = From l In lista _
Group l By l.ID_CLI, l.Cliente Into Group _
Order By Group.Sum(Function(s) s.Valor) Descending _
Select New With {.COD_CLIENTE = ID_CLI, .NOME_CLIENTE = Cliente, .TOTAL = Group.Sum(Function(s) s.Valor)}

For Each ml In MyList
TextBox1.Text &= [Ô]Cód. [Ô] & ml.COD_CLIENTE & [Ô]: [Ô] & ml.NOME_CLIENTE & Environment.NewLine()

Dim MyListNew = From l In lista _
Where l.ID_CLI = ml.COD_CLIENTE
Order By l.Valor Ascending
Select New With {l.ID_CLI, l.Cliente, l.Valor}

For Each lt In MyListNew
TextBox1.Text &= vbTab & [Ô]R$[Ô] & lt.Valor.ToString([Ô]#0.00[Ô]) & Environment.NewLine()
Next

TextBox1.Text &= vbTab & [Ô]R$[Ô] & ml.TOTAL.ToString([Ô]#0.00[Ô]) & Environment.NewLine() & Environment.NewLine()

Next
MAXCIM 18/11/2014 21:20:16
#442608
Olá Filmam, deu certo
só mais um coisa, tem como a instrução de order by ser opcional ou editável?

o cliente quer ter a opção de ordenar pelo valor total do grupo ou pelo nome do cliente.


desde já agradeço.
FILMAN 19/11/2014 00:52:33
#442612
Faça o seguinte

crie uma tela como a tela em anexo e coloque o código abaixo dentro do evento click do botão

        TextBox1.Text = String.Empty

Dim lista As New List(Of ItensPed)()

lista.Add(New ItensPed() With {.ID_CLI = 1, .Cliente = [Ô]NOME PARA TESTE 1[Ô], .Valor = 1})
lista.Add(New ItensPed() With {.ID_CLI = 2, .Cliente = [Ô]NOME PARA TESTE 922[Ô], .Valor = 12})
lista.Add(New ItensPed() With {.ID_CLI = 3, .Cliente = [Ô]NOME PARA TESTE 3[Ô], .Valor = 13})
lista.Add(New ItensPed() With {.ID_CLI = 4, .Cliente = [Ô]NOME PARA TESTE 4[Ô], .Valor = 14})
lista.Add(New ItensPed() With {.ID_CLI = 5, .Cliente = [Ô]NOME PARA TESTE 955[Ô], .Valor = 15})
lista.Add(New ItensPed() With {.ID_CLI = 6, .Cliente = [Ô]NOME PARA TESTE 6[Ô], .Valor = 16})
lista.Add(New ItensPed() With {.ID_CLI = 7, .Cliente = [Ô]NOME PARA TESTE 7[Ô], .Valor = 17})
lista.Add(New ItensPed() With {.ID_CLI = 8, .Cliente = [Ô]NOME PARA TESTE 8[Ô], .Valor = 18})
lista.Add(New ItensPed() With {.ID_CLI = 9, .Cliente = [Ô]NOME PARA TESTE 9[Ô], .Valor = 19})
lista.Add(New ItensPed() With {.ID_CLI = 1, .Cliente = [Ô]NOME PARA TESTE 1[Ô], .Valor = 21.45})
lista.Add(New ItensPed() With {.ID_CLI = 2, .Cliente = [Ô]NOME PARA TESTE 922[Ô], .Valor = 17.58})
lista.Add(New ItensPed() With {.ID_CLI = 3, .Cliente = [Ô]NOME PARA TESTE 3[Ô], .Valor = 118})
lista.Add(New ItensPed() With {.ID_CLI = 4, .Cliente = [Ô]NOME PARA TESTE 4[Ô], .Valor = 14.59})
lista.Add(New ItensPed() With {.ID_CLI = 5, .Cliente = [Ô]NOME PARA TESTE 955[Ô], .Valor = 145.59})
lista.Add(New ItensPed() With {.ID_CLI = 6, .Cliente = [Ô]NOME PARA TESTE 6[Ô], .Valor = 18.96})
lista.Add(New ItensPed() With {.ID_CLI = 7, .Cliente = [Ô]NOME PARA TESTE 7[Ô], .Valor = 15.01})
lista.Add(New ItensPed() With {.ID_CLI = 8, .Cliente = [Ô]NOME PARA TESTE 8[Ô], .Valor = 19.99})
lista.Add(New ItensPed() With {.ID_CLI = 9, .Cliente = [Ô]NOME PARA TESTE 9[Ô], .Valor = 114.54})

Dim MyList = From l In lista _
Group l By l.ID_CLI, l.Cliente Into Group _
Select New With {.COD_CLIENTE = ID_CLI, .NOME_CLIENTE = Cliente, .TOTAL = Group.Sum(Function(s) s.Valor)}

Select Case ComboBox1.SelectedIndex
Case 0
MyList = IIf((ComboBox2.SelectedIndex = 0), MyList.OrderBy(Function(o) o.COD_CLIENTE), MyList.OrderByDescending(Function(o) o.COD_CLIENTE))
Case 1
MyList = IIf((ComboBox2.SelectedIndex = 0), MyList.OrderBy(Function(o) o.NOME_CLIENTE), MyList.OrderByDescending(Function(o) o.NOME_CLIENTE))
Case Else
MyList = IIf((ComboBox2.SelectedIndex = 0), MyList.OrderBy(Function(o) o.TOTAL), MyList.OrderByDescending(Function(o) o.TOTAL))
End Select

For Each ml In MyList
TextBox1.Text &= [Ô]Cód. [Ô] & ml.COD_CLIENTE & [Ô]: [Ô] & ml.NOME_CLIENTE & Environment.NewLine()

Dim MyListNew = From l In lista _
Where l.ID_CLI = ml.COD_CLIENTE
Order By l.Valor Ascending
Select New With {l.ID_CLI, l.Cliente, l.Valor}

For Each lt In MyListNew
TextBox1.Text &= vbTab & [Ô]R$[Ô] & lt.Valor.ToString([Ô]#0.00[Ô]) & Environment.NewLine()
Next

TextBox1.Text &= vbTab & [Ô]R$[Ô] & ml.TOTAL.ToString([Ô]#0.00[Ô]) & Environment.NewLine() & Environment.NewLine()

Next
MAXCIM 19/11/2014 10:17:49
#442621
fera! matou..

valeu pela força!
Tópico encerrado , respostas não são mais permitidas