IQUERYABLE / LINQ / QUERIES

GGERMINIANI 14/09/2017 14:05:07
#476550
Pessoal,
Boa tarde.

Gostaria da ajuda de vcs em relação ao uso de queries de uma IQueryable extraída de um LINQ.

Tenho o seguinte código:

  Dim lista = From n In cnAus2.NFEs
Join it In cnAus2.ITENS_NFE
On n.ID_NFE Equals it.ID_NFE
Where n.ID_FORNECEDOR = i.p.ID_FORNECEDOR And it.ID_PRODUTO = i.p.ID_PRODUTO
Select n, it



Basicamente se trata de Notas Fiscais, então só imaginem que n representam a table NOTAS e it representa a table ITENS dentro das notas. Neste caso, estou buscando somente notas de um FORNECEDOR específico e um PRODUTO específico.

Assim, com a variável LISTA, gostaria de extrair algumas informações, por exemplo:

Dentro de it tenho a coluna VL_UNIT (valor unitário), e gostaria de pegar a média deste campo.

Penso que seja algo como:
Dim Media = lista.Where(Function(e) e.it.VL_UNIT.Value).Average



Da seguinte forma funciona perfeitamente:
Dim Media = (From n In cnAus2.NFEs
Join it In cnAus2.ITENS_NFE
On n.ID_NFE Equals it.ID_NFE
Where n.ID_FORNECEDOR = i.p.ID_FORNECEDOR And it.ID_PRODUTO = i.p.ID_PRODUTO
Select it.VL_UNIT).Average


Porém quero que entendam que com a iquery LISTA faria diferentes extrações de uma só vez como Média, Último valor, Menor valor, Maior Valor, etc....

Há alguma forma de aproveitar um só LINQ para ficar manipulando essa iqueryable de várias formas?

Grato.
KERPLUNK 14/09/2017 14:31:36
#476552
Ah, se todas as dúvidas fossem assim! Bem explicadas, bem ilustradas e com sentido!
Se lista já é a lista de notas e ítens desejados, você pode simplesmente:

dim media = lista.Select(x=> x.SeuCampo).Average
GGERMINIANI 14/09/2017 14:56:16
#476554
KERPLUNK,
Obrigado pela pronta resposta, porém não funcionou...

Para mim, Select entra somente na função Select(Of )... imagina o pq?

Grato.
KERPLUNK 14/09/2017 15:15:16
#476557
Talvez você tenha que fazer um cast em [Ô]lista[Ô], porque você a declara como tipo genérico.
GGERMINIANI 14/09/2017 16:42:20
#476562
Cara, desculpa a petulância, mas fiz diversos testes e acho que não estou nem perto... poderia me citar um exemplo?

Grato.
KERPLUNK 14/09/2017 17:33:27
#476565

DirectCast(lista, List(Of cnAus2.NFEs)).[Select](Function(x) x.Campo).Average()
GGERMINIANI 17/09/2017 21:25:23
#476626
Boa noite!

Esse tal de LINQ não quer me ajudar....

O código ficou:

Dim db As New AusBurgerModel
Dim lista = From notas In db.NFEs Join itens In db.ITENS_NFE On notas.ID_NFE Equals itens.ID_NFE Where notas.ID_FORNECEDOR = i.p.ID_FORNECEDOR And itens.ID_PRODUTO = i.p.ID_PRODUTO Select notas, itens
Dim media = DirectCast(lista, List(Of ITENS_NFE)).[Select](Function(v) v.VL_UNIT).Average()


Mas o erro persiste:
Data = {System.Collections.ListDictionaryInternal}
Message = [Ô]Não é possível converter um objeto do tipo [ô]System.Data.Entity.Infrastructure.DbQuery'1[VB$AnonymousType_12'2[AusBurger.Conexao.NFE,AusBurger.Conexao.ITENS_NFE]][ô] no tipo [ô]System.Collections.Generic.List'1[AusBurger.Conexao.ITENS_NFE][ô].[Ô]

Acredito que seja algo a ver com o directcast... a variável LISTA vem com uma coleção diferente do que estou convertendo no List(Of ITENS_NFE)... não?

Grato!
GGERMINIANI 19/09/2017 10:21:02
#476649
Olá a todos!

Bom, como infelizmente não consegui manipular da forma que queria, consegui encontrar outra solução, bem similar na verdade.

Pelo que percebi, o maior problema é não typar a variável LISTA.... porém consegui fazer da seguinte forma:

A variável LISTA (neste caso RESULTADO), joguei para um ToList

Dim Resultado = (From i In cnAus.ITENS_NFE
Join n In cnAus.NFEs
On i.ID_NFE Equals n.ID_NFE
Join p In cnAus.PRODUTOes
On i.ID_PRODUTO Equals p.ID_PRODUTO
Join f In cnAus.FORNECEDORs
On p.ID_FORNECEDOR Equals f.ID_FORNECEDOR
Join c In cnAus.CLASSIFICACAOs
On p.ID_CLASSE Equals c.ID_CLASSE
Where f.ID_FORNECEDOR <> _IDEmpresa
Select i, n, p, f, c
Order By n.DT_EMI, i.ID_ITENS, n.ID_NFE).ToList


A partir daí, consegui usar Where, Select e Function para navegar dentro da lista e usar algumas funções, como média, último preço, etc...

menorv = Resultado.Where(Function(x) x.p.PRODUTO1 = i.p.PRODUTO1).Min(Function(y) y.i.VL_UNIT)
mediav = Resultado.Where(Function(x) x.p.PRODUTO1 = i.p.PRODUTO1).Average(Function(y) y.i.VL_UNIT)
maiorv = Resultado.Where(Function(x) x.p.PRODUTO1 = i.p.PRODUTO1).Max(Function(y) y.i.VL_UNIT)
ultimv = Resultado.Where(Function(x) x.p.PRODUTO1 = i.p.PRODUTO1).[Select](Function(y) y.i.VL_UNIT).Reverse.First
penulv = Resultado.Where(Function(x) x.p.PRODUTO1 = i.p.PRODUTO1).[Select](Function(y) y.i.VL_UNIT).Reverse.Skip(1).First


Bom, para o pessoal que tiver uma situação parecida com a minha, espero que esse método ajude!

Abs.

Tópico encerrado , respostas não são mais permitidas