IQUERYABLE / LINQ / QUERIES
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:
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:
Da seguinte forma funciona perfeitamente:
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.
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.
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:
Se lista já é a lista de notas e Ãtens desejados, você pode simplesmente:
dim media = lista.Select(x=> x.SeuCampo).Average
KERPLUNK,
Obrigado pela pronta resposta, porém não funcionou...
Para mim, Select entra somente na função Select(Of )... imagina o pq?
Grato.
Obrigado pela pronta resposta, porém não funcionou...
Para mim, Select entra somente na função Select(Of )... imagina o pq?
Grato.
Talvez você tenha que fazer um cast em [Ô]lista[Ô], porque você a declara como tipo genérico.
Cara, desculpa a petulância, mas fiz diversos testes e acho que não estou nem perto... poderia me citar um exemplo?
Grato.
Grato.
DirectCast(lista, List(Of cnAus2.NFEs)).[Select](Function(x) x.Campo).Average()
Boa noite!
Esse tal de LINQ não quer me ajudar....
O código ficou:
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!
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!
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
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...
Bom, para o pessoal que tiver uma situação parecida com a minha, espero que esse método ajude!
Abs.
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