CONSULTA DINMICA COM LINQ

 Tópico anterior Próximo tópico Novo tópico

CONSULTA DINMICA COM LINQ

C#

 Compartilhe  Compartilhe  Compartilhe
#483728 - 07/08/2018 16:48:39

CLEVERTON
SERRINHA
Cadast. em:Dezembro/2003


Membro da equipe
Dessa forma no atende no ?

  public List<PedidoCab> obterPedidoCab(myContext _context, DateTime? dataOP, int CodOp, int CodPesE, int CodPesD, int NumNF, int NumCupom, int CodOpCaixa, int CodVendedor, int CodProd, string tpNFe, string tpMov, bool NFCanc)
        {
            bool DataValida = dataOP == null ? false : true;
            DateTime _dataInvalida = new DateTime(1899, 1, 1);
            DateTime _dataValida = dataOP == null ? _dataInvalida : dataOP.ToDateTime();

            var objRetorno = (from VC in _context.VendasCab
                              join VCO in _context.VendasCab_Operacoes on VC.CodigoOperacao equals VCO.Codigo
                              join PesD in _context.Pessoas on VC.CodPessoaDestina equals PesD.Codigo
                              join PesE in _context.Pessoas on VC.CodPessoaEmissor equals PesE.Codigo
                              join vDet in _context.VendasDet on VC.Codigo equals vDet.CodigoCab
                              join Usu in _context.Usuarios on VC.CodigoUsuario equals Usu.Codigo
                              where
                              (CodOp > 0 ? VC.CodigoOperacao.Equals(CodOp) : VC.CodigoOperacao >= 0)
                              && (DataValida ? VC.DataVenda.Equals(_dataValida) : VC.DataVenda >= _dataInvalida)
                              && (CodPesE > 0 ? VC.CodPessoaEmissor.Equals(CodPesE) : VC.CodPessoaEmissor >= 0)
                              && (CodPesD > 0 ? VC.CodPessoaDestina.Equals(CodPesD) : VC.CodPessoaDestina >= 0)
                              && (NumNF > 0 ? VC.NumeroNotaE.Equals(NumNF) : VC.NumeroNotaE >= 0)
                              && (NumCupom > 0 ? VC.NumeroCupom.Equals(NumCupom) : VC.NumeroCupom >= 0)
                              && (CodOpCaixa > 0 ? VC.CodigoUsuario.Equals(CodOpCaixa) : VC.CodigoUsuario >= 0)
                              && (CodVendedor > 0 ? VC.CodigoVendedor.Equals(CodVendedor) : VC.CodigoVendedor >= 0)
                              && (CodProd > 0 ? vDet.CodigoProduto.Equals(CodProd) : vDet.CodigoProduto >= 0)
                              && (tpNFe.Trim().Length > 0 ? VC.tipoNotaE.Equals(tpNFe) : ((VC.tipoNotaE ?? [][]).Length >= 0))
                              && (tpMov.Trim().Length > 0 ? VC.TipoMovimento.Equals(tpMov) : ((VC.TipoMovimento ?? [][]).Length >= 0))
                              && (NFCanc ? VC.Excluido == true : VC.Excluido != true)
                              group vDet by
                              new
                              {
                                  Codigo = VC.Codigo,
                                  tipoOP = VCO.Nome,
                                  dataOP = VC.Agora ?? new DateTime(1899, 1, 1),
                                  NumeroNFE = VC.NumeroNotaE,
                                  NumeroDoc = VC.NumeroCupom,
                                  Emitente = PesE.Nome,
                                  Destinatario = PesD.Nome,
                                  ValorRecebido = VC.ValorRecebido,
                                  Troco = VC.Troco,
                                  Excluido = VC.Excluido,
                                  Vendedor = Usu.Nome
                              }
                              into g
                              select new PedidoCab
                              {
                                  Codigo = g.Key.Codigo,
                                  tipoOP = g.Key.tipoOP,
                                  dataOP = g.Key.dataOP,
                                  NumeroNFE = g.Key.NumeroNFE,
                                  NumeroDoc = g.Key.NumeroDoc,
                                  Emitente = g.Key.Emitente,
                                  Destinatario = g.Key.Destinatario,
                                  Desconto = g.Sum(tx => tx.Desconto),
                                  ValorRecebido = g.Key.ValorRecebido,
                                  Troco = g.Key.Troco,
                                  Excluido = g.Key.Excluido,
                                  SubTotal = g.Sum(tx => tx.TotalItem),
                                  Vendedor = g.Key.Vendedor
                              })
                              .OrderByDescending(l => l.Codigo)
                              .ToList();

            return objRetorno;
        }




#483729 - 07/08/2018 17:30:23

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
CLEVERTON, LINQ bacana e bem elucidativo, mas no final ele ser compilado para uma expresso Lambda, por isso pode acarretar em uma pequena perda de performance. Sempre que possvel use expresses Lambda, caso no tenha a manha ainda de fazer, use o LINQPad, ele ajuda no s fazer LINQ como transforma de um para outro.

_______________________________________________________________________
Virei Orculo!
The end is nigh, be ready for the nukes!


#483730 - 07/08/2018 18:53:53

CLEVERTON
SERRINHA
Cadast. em:Dezembro/2003


Membro da equipe
Citação:
:
CLEVERTON, LINQ bacana e bem elucidativo, mas no final ele ser compilado para uma expresso Lambda, por isso pode acarretar em uma pequena perda de performance. Sempre que possvel use expresses Lambda, caso no tenha a manha ainda de fazer, use o LINQPad, ele ajuda no s fazer LINQ como transforma de um para outro.


Essa consulta sem criar ndices nem consegui ver o resultado de tanta demora.
Depois que criei, ficou instantaneo, mas vou pesquisar o que vc falou.



#483731 - 07/08/2018 20:52:44

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
que em geral, a parte []pesada[] de consultas complexas assim a montagem e verificao do produto cartesiano, por isso os ndices ajudam tanto.

_______________________________________________________________________
Virei Orculo!
The end is nigh, be ready for the nukes!


#483735 - 08/08/2018 09:24:43

CARINHENA
SOROCABA
Cadast. em:Junho/2004


Última edição em 08/08/2018 09:52:19 por CARINHENA

Eu nunca gostei dessa abordagem do Linq, extramente mais lento do que o modo normal, alm de aumentar a complexidade.

Sempre achei a maneira disso funcionar, meio burra.
uma complexidade abstrata, que degrada o desempenho em at 800% (como em vrios testes por ai).

No sei como isso pegou..


Carinhena

A melhor forma de aprender e ensinando!


#483737 - 08/08/2018 09:35:11

CLEVERTON
SERRINHA
Cadast. em:Dezembro/2003


Membro da equipe

Última edição em 08/08/2018 09:37:22 por CLEVERTON

Citação:
:
Eu nunca gostei dessa abordagem do Linq, extramente mais lento do que o modo normal, alm de aumentar a complexidade.

Sempre achei a criana e a maneira disso funcionar, meio burra.
uma complexidade abstrata, que degrada o desempenho em at 800% (como em vrios testes por ai).

No sei como isso pegou..


Complexidade de algo muito relativo. Poderia at me arriscar a falar que comodismo...
muitas aplicaes so bugadas PQ tem muita string pra tudo.... ai na hora de fazer uma alterao no banco o bixo pega, erros s so descobertos em produo.

E sobre a questo de performance, muito da realidade de cada um, meus bancos no entram na casa de muitos milhes de registros... a resposta  pra mim ( criando ndices ) est sendo satisfatria.




#483738 - 08/08/2018 10:08:20

CARINHENA
SOROCABA
Cadast. em:Junho/2004


Última edição em 08/08/2018 10:31:34 por CARINHENA

Citação:
:
:
Eu nunca gostei dessa abordagem do Linq, extramente mais lento do que o modo normal, alm de aumentar a complexidade.

Sempre achei a criana e a maneira disso funcionar, meio burra.
uma complexidade abstrata, que degrada o desempenho em at 800% (como em vrios testes por ai).

No sei como isso pegou..

Complexidade de algo muito relativo. Poderia at me arriscar a falar que comodismo...
muitas aplicaes so bugadas PQ tem muita string pra tudo.... ai na hora de fazer uma alterao no banco o bixo pega, erros s so descobertos em produo.

E sobre a questo de performance, muito da realidade de cada um, meus bancos no entram na casa de muitos milhes de registros... a resposta  pra mim ( criando ndices ) est sendo satisfatria.


Eu considero comodismo quando algo muito melhor (em todos os aspectos), tem melhor desempenho como uso.
Se no um, nem outro, no comodismo, no caso, consideraria modismo (alis, boa parte dos que gostam dele, gostam porque facilita o uso, e o desenvolvedor tem a falsa impresso que s []persistncia[] de dados, no precisa se preocupar em como deixar isso preparado).

Qualquer desenvolvedor que tem como meta fazer algo com bom desempenho, sabe o quanto as consultas geradas no banco na grande maioria so BEM ruins, alteram o uso de indices e ainda anulam muitas vezes, o plano de execuo.

Se voc pegar aplicaes complexas e robustas (Que precisam de desempenho acima de tudo), voc nunca vai ver empresas usando essa abordagem.
O Entity + Linq facilitam pro desenvolvedor (Se ele abrir a mente e comear a ter que aprender coisas que antes ele NO precisava se preocupar com conceitos de unit of work, repositrios, dbcontext, debset, Lazy Load, entre outras coisas). Fora problemas com um monte de converses implcitas, que voc no tem controle.

Um artigo muito legal sobre isso (na viso de DBA):
http://https://blogs.msdn.microsoft.com/fcatae/2017/07/11/entity-framework-broken-linq

Mas, no entra na minha cabea usar algo que tenho que aprender um monte de coisa que no precisava antes, com um desempenho muito pior.
Quando o Stack fez o teste com o Entity + Linq, eles usaram a melhor abordagem possvel.. e da deu uma diferena absurda, imagine se o desenvolvedor acabar no usando a melhor abordagem?

Citação:
muitas aplicaes so bugadas PQ tem muita string pra tudo.... ai na hora de fazer uma alterao no banco o bixo pega, erros s so descobertos em produo.  

Isso m abordagem, no se usa string para sql.
Alm do que essa abordagem primeiro pensada em COMO salvar no banco da MELHOR maneira, e no o contrrio.


Mas, enfim.. no vou me estender sobre isso, porque no vai agregar nada a quem criou o tpico para sanar sua dvida.
Bom tpico a todos!


Carinhena

A melhor forma de aprender e ensinando!


#483741 - 08/08/2018 11:41:10

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
Olha uma coisa que posso afirmar com certeza que empresas grandes preferem SIM abordagem de desenvolvimento mais aprimoradas. A Dell por exemplo, so rarssimos projetos onde no se usa algum tipo de ORM, quando acontece, ou algum subset(verso prpria do ORM) ou algo muito pequeno(como algum rob) que no justificaria a implementao de algo to complexo. At porque, aplicaes de nvel alto em complexidade e escalabilidade, requerem prticas de desenvolvimento que sejam mais fceis de serem administradas. Empresas grandes(como a Dell), dificilmente precisam se preocupar com limitaes de hardware. J vi casos de projetos bem pequenos que recebem um cluster monstruoso s pra ele e ento essa preocupao totalmente eliminada. Alm disso, essas aplicaes devem ser passveis de containerizao(Docker, PCF ou semelhante) e de preferncia(quase que obrigatrio, na realidade) multi-plataforma. O design de cdigo muito bem pensado, assim como o design de dados e como os dois so vinculados. A tendncia uma migrao para um modelo de aplicaes baseada em micro-servios. Onde existem dezenas(s vezes milhares) de pequenos servios que se intercomunicam, geralmente por Queue. Esse approach resulta em uma altssima interoperabilidade. Para quem no conhece bem isso, difcil entender como, mas vamos um exemplo:

O cenrio:
Sua aplicao possui, clientes, produtos e movimentaes de produtos(venda). Ou seja, um cliente compra e isso gera um registro de movimentao de produto(basicamente um estoque).
A parte de clientes, um micro-servio(REST) que dispe dados de clientes.
O mesmo caso para produtos e movimentaes de produtos.
Como clientes e produtos so independentes, qualquer aplicao pode inserir/consultar/excluir clientes e produtos vontade, em um servio bem simples que dedicado exclusivamente para cada uma de suas entidades respectivas.
O mesmo para movimentao de produto. Qualquer aplicao pode lanar uma movimentao de produto, consultando um produto e um cliente vlido em seus respectivos servios.
At aqui, tudo isso pode ser conseguido com um servio REST simples, um monolito que contenha tanto produtos quando clientes. Mas aqui entra o pulo do gato:

A empresa possui parcceiros que fazem a parte de transporte do produto at o cliente. Esses parceiros devem ser avisados que um produto foi vendido para determinado cliente para agendar a entrega. Esse aviso, no pode depender de o parceiro de transporte ficar consultando toda hora, ele deve receber algum aviso disso de forma automtica. simples, basta criar uma Queue para o servio que contempla tanto clientes quanto produtos. Bem, esse approach no uma boa idia, pois um parceiro poderia ver dados que no so dele(consultar algum cliente ou produto). Obviamente que poderamos criar todo um esquema de permisses onde o parceiro s vai ver determinados clientes ou produtos, mas isso aumentaria exponencialmente a complexidade. a que a separao de responsabilidade onde cada micro-servio responsvel por apenas uma pequena parte de um processo bem maior. O parceiro, s vai ver o que interessa ele e nada mais. Ele estar inscrito na fila e quando uma movimentao de produto criada, uma mensagem para ele pendurada na Queue e ele vai ver essa mensagem se estiver inscrito na Queue.

Essa coisa de boas prticas e frameworks mais robustos ou []complexos[] no para enfeite. Uma aplicao fazendo bom uso de um ORM por exemplo, exponencialmente mais rpida quanto manuteno e desenvolvimento.

_______________________________________________________________________
Virei Orculo!
The end is nigh, be ready for the nukes!


#483743 - 08/08/2018 11:49:31

CARINHENA
SOROCABA
Cadast. em:Junho/2004


Depende.
Voc no vai ver aplicativo relacionado a bolsa de valores usando ORM, por exemplo.
Porque nesse caso, eles precisam de velocidade, coisa que o ORM hoje, no da (tirando os famosos MicroORM).
Eu sei, porque participei disso.

Voc percebeu o nmero de abordagens para validar o uso do ORM, em diferente esferas?
Essa complexidade que o ORM trouxe apenas para economizar um bom design de banco, vale a pena?

Embora o MicroServices seja uma tendencia, isso no quer dizer que vai usar para todas as formas.

Ento, tenho em mente, que a complexidade que o ORM trs  ao custo de desempenho (Que deveria ser a questo nmero 1), no me agrada.


Carinhena

A melhor forma de aprender e ensinando!


#483746 - 08/08/2018 12:35:38

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
Bem, no sei porque algum teria um ORM com uma aplicativo para bolsa de valores. Mexi pouco com isso ento no tenho como dizer com total certeza se seria necessrio, o que fiz era basicamente um homebroker. No precisei armazenar nada no customer. A aplicao em si, consultava por streaming os dados de da BMF. No cheguei fazer nada alm de simples consulta, talvez se tivesse que fazer a parte de compra e venda a talvez sim, mesmo achando que no, afinal o cliente simplesmente posta a transao e a operadora que faz a parte burocrtica.

_______________________________________________________________________
Virei Orculo!
The end is nigh, be ready for the nukes!


 Tópico anterior Próximo tópico Novo tópico


Tópico encerrado, respostas não sao permitidas
Encerrado por PERCIFILHO em 13/08/2018 10:51:26