CONSULTA DINÂMICA COM LINQ

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

CONSULTA DINÂMICA COM LINQ

C#

 Compartilhe  Compartilhe  Compartilhe
#483711 - 07/08/2018 09:05:08

PERCIFILHO
MATAO [SP]
Cadast. em:Dezembro/2009


Bom dia a todos.
Estou querendo fazer uma tela de consulta dinâmica no estoque dos produtos, onde o usuário escolhe os filtros que quer utilizar.
Essa é a tela

O usuário escolhe Mostrar Movimentação. Se ele quiser listar a movimentação de todos os produtos é só clicar no botão Processar. Se ele quiser filtrar a movimentação de apenas um produto, ele digita o código do produto e clica no botão Processar.
A query que realiza essa consulta é essa:

var filtro = from est in db.Estoque
join prod in db.Produto on est.ProdutoId equals prod.Id
join tipo in db.TipoOperacao on est.SiglaTipoOperacao equals tipo.Sigla
select new
{
    data = est.Data,
    codigoproduto = est.CodigoProduto,
    produto = prod.Descricao,
    quantidade = est.Quantidade,
    sigla = tipo.Sigla,
    tipooperacao = tipo.Descricao,
};


Estou pegando a movimentação na tabela Estoque e dando um Join nas tabelas Produto (para trazer a descrição) e Tipo de Operação (venda, retorno, devolução, etc).
Até aqui funciona perfeito, mostrando toda a movimentação.
Agora se eu quiser aplicar filtros, por exemplo, digitando um código de produto, tenho que acrescentar uma cláusula Where na query.
Nosso amigo Kerplunk já me passou o código, essa linha ficaria assim:
.Where(x => (mskCodigoProduto.Text != "") ? x.codigoproduto == mskCodigoProduto.Text : x.codigoproduto != null)

Só que não dá certo, ocorre uma Exception conforme a imagem abaixo:

Alguém poderia me ajudar? Estou trabalhando com Entity Framework e Banco de Dados SQLCE.

____________________________________________________
Você sabe que alguém te ama não pelo que ele fala, mas pelo o que faz.
O amor não sobrevive de teorias.




Resposta escolhida #483712 - 07/08/2018 09:30:29

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


Membro da equipe
Aquele valor "01.00001" não te é familiar?

_______________________________________________________________________
Gostaria de ter seu sistema Desktop "traduzido" para uma interface web? Podemos conversar...
Virei Oráculo!
The end is nigh, be ready for the nukes!


#483713 - 07/08/2018 09:49:02

PERCIFILHO
MATAO [SP]
Cadast. em:Dezembro/2009


Última edição em 07/08/2018 09:49:45 por PERCIFILHO

Bom dia, Kerplunk.

Citação:
Aquele valor "01.00001" não te é familiar?


Sim, é o código que eu digitei para mostrar somente a movimentação deste produto.

Não entendi a sua pergunta, mas reparei que no InnerException tem um valor max=0 e len=8. Então pensei em alterar a linha do código para:
.Where(x => (mskCodigoProduto.Text != "  .     ") ? x.codigoproduto == mskCodigoProduto.Text : x.codigoproduto != null)

colocando os espaços em branco e o ponto para ficar com o comprimento do código.
E não é que FUNCIONOU?


____________________________________________________
Você sabe que alguém te ama não pelo que ele fala, mas pelo o que faz.
O amor não sobrevive de teorias.




#483714 - 07/08/2018 09:51:02

PERCIFILHO
MATAO [SP]
Cadast. em:Dezembro/2009


Fiz com as datas da mesma maneira, colocando espaços em branco e as barras, e também funcionou.

____________________________________________________
Você sabe que alguém te ama não pelo que ele fala, mas pelo o que faz.
O amor não sobrevive de teorias.




#483715 - 07/08/2018 10:11:48

PERCIFILHO
MATAO [SP]
Cadast. em:Dezembro/2009


Agora, eu só não sei como implementar essa mesma idéia com as ComboBox para ordenar por determinado(s) campo(s).
Na minha tela eu tenho como ordenar por duas colunas. Por exemplo:



Neste caso quero ordenar por data ascendente e depois por descrição também ascendente.

Você acha que existe outra maneira mais fácil ou mais funcional que essa ou assim também é possível?
Se for possível gostaria que me desse "pistas" de como fazer. Não quero somente código pronto, quero aprender.


____________________________________________________
Você sabe que alguém te ama não pelo que ele fala, mas pelo o que faz.
O amor não sobrevive de teorias.




#483720 - 07/08/2018 12:34:10

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


Membro da equipe
Veja bem, o que você está querendo fazer, foge um pouco da proposta de simplificação do EF, é por isso que no outro tópico sugeri a utilização de um PredicateBuilder.
Outra alternativa viável e que pode até ser melhor para você, se quiser expandir ainda mais isso no futur, é o uso de DTO's com implementação de Fluent API. Assim, você pode "amarrar" objetos à cláusulas e predicados. Isso porque, se no futuro você quiser múltiplas possibilidades de cláusula(where), você teria um pouco mais de dificuldade. Uma idéia de como poderia ficar seria:

meuContexto.AddCondition(x => x.CodigoCliente, txtCodigoCliente).WithOperator(Operators.Equal);
meuContexto.AddCondition(x => x.DataCadastro, (txtDataInicial, txtDataFinal).WithOperator(Operators.Between);
meuContexto.OrderComponent(txtOrdenacao).Direction(txtDirecaoOrdenacao);
var meusDados = meuContexto.Get();


Usei assim em um projeto que tem relatórios criados dinamicamente pelo cliente. Esses relatórios além de gerados pelo próprio cliente(arrasta e solta colunas, formata agrupamentos e outras funcionalidades), também tem o formulário de seleção de dados gerado dinamicamente. Os campos adicionados ao relatório podem ser marcados como "filtráveis", por exemplo, adiciona o campo "codigoCliente" e marca a propriedade "Filter" como true, ao executar o relatório, uma janela é exibida, mostrando uma label e um campo para digitar o código do cliente desejado. Pena que não posso compartilhar aqui tudo isso porque é proprietário, o cara pagou por isso e mesmo eu tendo o fonte, não posso compartilhar.

_______________________________________________________________________
Gostaria de ter seu sistema Desktop "traduzido" para uma interface web? Podemos conversar...
Virei Oráculo!
The end is nigh, be ready for the nukes!


#483721 - 07/08/2018 12:35:04

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


Membro da equipe
Esqueci de colocar alguma coisa sobre Fluent API

_______________________________________________________________________
Gostaria de ter seu sistema Desktop "traduzido" para uma interface web? Podemos conversar...
Virei Oráculo!
The end is nigh, be ready for the nukes!


#483722 - 07/08/2018 14:11:28

PERCIFILHO
MATAO [SP]
Cadast. em:Dezembro/2009


Então, Kerp, eu havia conseguido o resultado esperado, só que tive que usar alguns if's para ir montando os filtros, eu só pensei que conseguiria fazer um código economizando linha, mas acho que vou desistir já que creio que não vai valer a pena insistir nisso, vou procurar entender mais sobre o PredicateBuilder, já que até agora não encontrei nenhum material que me ajudasse muito, mas agradeço muito a sua disposição em me ajudar. Deixo o tópico aberto por enquanto para se você ou alguém mais quiser dar sugestões.

____________________________________________________
Você sabe que alguém te ama não pelo que ele fala, mas pelo o que faz.
O amor não sobrevive de teorias.




#483723 - 07/08/2018 14:14:01

PERCIFILHO
MATAO [SP]
Cadast. em:Dezembro/2009


Citação:
Usei assim em um projeto que tem relatórios criados dinamicamente pelo cliente. Esses relatórios além de gerados pelo próprio cliente(arrasta e solta colunas, formata agrupamentos e outras funcionalidades), também tem o formulário de seleção de dados gerado dinamicamente. Os campos adicionados ao relatório podem ser marcados como "filtráveis", por exemplo, adiciona o campo "codigoCliente" e marca a propriedade "Filter" como true, ao executar o relatório, uma janela é exibida, mostrando uma label e um campo para digitar o código do cliente desejado.

Deve ter ficado muito show.

____________________________________________________
Você sabe que alguém te ama não pelo que ele fala, mas pelo o que faz.
O amor não sobrevive de teorias.




#483724 - 07/08/2018 14:19:23

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


Membro da equipe
O PredicateBuilder é de nível moderado/alto no seu aspecto de implementação técnica. Não chega à ser um bicho de sete cabeças, mas também não é mamão com açúcar.

_______________________________________________________________________
Gostaria de ter seu sistema Desktop "traduzido" para uma interface web? Podemos conversar...
Virei Oráculo!
The end is nigh, be ready for the nukes!


#483725 - 07/08/2018 14:26:52

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


Membro da equipe
Citação:
:
Usei assim em um projeto que tem relatórios criados dinamicamente pelo cliente. Esses relatórios além de gerados pelo próprio cliente(arrasta e solta colunas, formata agrupamentos e outras funcionalidades), também tem o formulário de seleção de dados gerado dinamicamente. Os campos adicionados ao relatório podem ser marcados como "filtráveis", por exemplo, adiciona o campo "codigoCliente" e marca a propriedade "Filter" como true, ao executar o relatório, uma janela é exibida, mostrando uma label e um campo para digitar o código do cliente desejado.
Deve ter ficado muito show.

Ficou bem bacana mesmo, ainda mais por estar(agora) implementado Web. Usando o Electron, ficou até melhor que eu esperava. As telas de consulta, são geradas dinamicamente em HTML5, que encaminham os parâmetros para o core do report, que por sua vez é um arquivo json contendo todas as coisas relacionadas à ele: fonte de dados (tabelas/views/SQL/Entitdades), campos à serem exibidos, campos à serem agrupados(soma/média/contagem/fórmula, cores e fontes, alinhamento horizontal, opcional consultável, opcional formato de dados de consulta(se intervalo, número fixo, valor data...)), formato de saída(HTML/PDF/XHTML/diversos formatos para exportação), opções de cabeçalho(número da página, data/hora, alinhamento vertical das colunas na página, rodapé e algumas outras).

_______________________________________________________________________
Gostaria de ter seu sistema Desktop "traduzido" para uma interface web? Podemos conversar...
Virei Oráculo!
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