COMO DECLARAR ESTA VARIÁVEL

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

COMO DECLARAR ESTA VARIÁVEL

C#

 Compartilhe  Compartilhe  Compartilhe
#483589 - 02/08/2018 10:15:06

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


Membro da equipe
Acho que assim deve dar certo:

var filtro = from p in Produto
                   select p;

if (condicao) // nem precisa do true
{
    using (db = new Conexao())
    {
        filtro = from est in db.Estoque
                   join prod in db.Produto on est.ProdutoId equals prod.Id
                   select est;
    }
}


_______________________________________________________________________
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!


#483590 - 02/08/2018 10:35:55

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


Realmente, Kerplunk dessa maneira dá certo, porém o que eu queria fazer é algo um pouco diferente, talvez você possa me ajudar.
A tela é essa:



Estou fazendo assim:
Quando clicar no botão Processar, dependendo de qual CheckBox foi selecionada, faço a consulta.
Depois disso, faço as outras verificações, por exemplo: se foi digitado o código do produto, mostro apenas o produto, senão mostra todos.

using (db = new Conexao())
{
    var filtro;

    if (chkMostrarMovimentacao.Checked == true)
    {
        // se for selecionado Mostrar Movimentação
        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
    }
    else if (chkMostrarEstoqueAtual.Checked == true)
    {
        // for selecionado Mostrar Estoque Atual
        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
   }

    // verifica se foi digitado o código do produto
    if (txtCodigoProduto.Text != "")
    {
        filtro = filtro.Where(x => x.codigoproduto == txtCodigoProduto.Text);
    }

    dgv.DataSource = filtro.ToList();
}                            

É correto fazer dessa maneira, ou você teria uma outra ideia pra me mostrar? Lembrando que assim não consigo "acessar" a variável filtro, ok?


____________________________________________________
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.




#483593 - 02/08/2018 11:02:17

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


Membro da equipe
As duas queries me parecem ser exatamente iguais, então pode usar a mesma metodologia que passei antes:

using (db = new Conexao())
{
    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
    if (chkMostrarEstoqueAtual.Checked)
    {
        // for selecionado Mostrar Estoque Atual
        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
   }

    // verifica se foi digitado o código do produto
    if (txtCodigoProduto.Text != "")
    {
        filtro = filtro.Where(x => x.codigoproduto == txtCodigoProduto.Text);
    }

    dgv.DataSource = filtro.ToList();
}                          


Assim já funcionaria, mas pessoalmente, eu usaria um PredicateBuilder, tanto para a cláusula "Where" quanto o OrderBy que me parece que você vai querer implementar. Fica um pouco mais complexo, mas vai sempre resolver tudo com uma só chamada. Ficaria mais ou menos assim:

var filtro = db.Estoque
     .Join(db.Produto, est.ProdutoId = prod.Id)
     .Join(db.Tipo, est.SiglaTipoOperacao = tipo.Sigla)
     .Where(x => (txtCodigo.Text != "") || txtCodigo.Text);


_______________________________________________________________________
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!


#483594 - 02/08/2018 11:07:00

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


Membro da equipe
Uma dica é usar o LINQPad. Você faz nele suas queries e converte para LINQ ou expressões Lambda.

_______________________________________________________________________
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!


#483597 - 02/08/2018 11:13:05

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


Citação:
As duas queries me parecem ser exatamente iguais

Eu errei ao copiar a query do chkEstoqueAtual. É assim:

// se for selecionado Mostrar Estoque Atual
filtro= from p in db.Produto
         select new

Então, as duas queries são diferentes, daí a necessidade de se se criar a variável filtro e alterar conforme a seleção do usuário.
Quanto ao PredicateBuilder, gostei, nunca tinha usado. Vou fazer minhas modificações aqui.

____________________________________________________
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.




#483598 - 02/08/2018 11:20:00

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


Citação:
Uma dica é usar o LINQPad. Você faz nele suas queries e converte para LINQ ou expressões Lambda.

Ok, vou baixar e utilizar, obrigado pela dica.

____________________________________________________
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.




#483618 - 02/08/2018 15:23:22

GUIMORAES
ITAPETININGA
Cadast. em:Agosto/2009


Se as duas querys são diferentes, o uso do PredicateBuilder é a solução, pois desta forma você não precisa instanciar uma variável para armazenar o resultado e depois aplicar o where ao mesmo.




#483648 - 03/08/2018 09:00:19

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


Bom dia pessoal, estive procurando sobre PredicateBuilder, mas não consegui nada que me esclarecesse pra eu poder entender.
Eu gostaria de uma ajuda no seguinte caso: Analisando o print que eu enviei da tela de pesquisa ao estoque, estou fazendo assim:
Monto a query com Join nas tabelas Estoque, Produto e TipoOperacao e no Select os campos que vou mostrar no DataGridView
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,
};

Aí, eu faço as condições verificando: se o usuário digitou código do produto vai mostrar somente a movimentação daquele produto, senão vai mostrar todos:
if (IsNullOrEmpty(mskCodigoProduto.Text))
{
    filtro = filtro.Where(x => x.codigoproduto == mskCodigoProduto.Text);
}

Depois verifica se datas foram digitadas
if (IsNullOrEmpty(mskDataInicial.Text) && IsNullOrEmpty(mskDataFinal.Text))
{
    DateTime _datainicial = Convert.ToDateTime(mskDataInicial.Text);
    DateTime _datafinal = Convert.ToDateTime(mskDataFinal.Text);
    filtro = filtro.Where(x => x.data >= _datainicial && x.data <= _datafinal);
}

E por fim verifica se foi selecionado um tipo de operação
if (IsNullOrEmpty(txtSiglaTipoOperacao.Text))
{
    filtro = filtro.Where(x => x.sigla == txtSiglaTipoOperacao.Text);
}

Gostaria de eliminar esse monte de Ifs, mas não estou conseguindo. Pelo que eu entendi o PredicateBuilder faz exatamente isso, não é?
Kerplunk ou Guimoares podem me dar uma luz?

____________________________________________________
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.




#483650 - 03/08/2018 09:52:55

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


Membro da equipe
Já tinha te mostrado como fazer:

var filtro = db.Estoque
     .Join(db.Produto, est.ProdutoId = prod.Id)
     .Join(db.Tipo, est.SiglaTipoOperacao = tipo.Sigla)
     .Where(x => (txtCodigo.Text != "") || x.codigoproduto = txtCodigo.Text); //Observe essa linha.

É só usar o mesmo princípio para as demais condicionais.

_______________________________________________________________________
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!


#483651 - 03/08/2018 10:13:50

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


Ocorre o erro:
Operator '||' cannot be applied to operands of type 'bool' and 'string'



____________________________________________________
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.




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


Tópico encerrado, respostas não sao permitidas
Encerrado por PERCIFILHO em 07/08/2018 08:36:05