MúLTIPLAS CONDIçõES LINQ

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

MúLTIPLAS CONDIçõES LINQ

VB.NET

 Compartilhe  Compartilhe  Compartilhe
#497160 - 09/06/2021 13:08:27

MAXCIM
GUARULHOS
Cadast. em:Dezembro/2003


Última edição em 09/06/2021 13:36:45 por MAXCIM

 Anexos estao visíveis somente para usuários registrados

Olá amigos, tudo bem?

minha saga com POO continua...

preciso fazer um  where com varias condições,   usando AND e OR    ( o OR terá varias clausulas)

as condições fixas:  LIST_RH.ID_EMP =1  and LIST_RH.Mes = 5 and LIST_RH.ano = 2021
as condições variáveis ( conforme seleção no checkBox). estas condições são com OR   ( pelo menos uma condição deve ser atingida)

se check_faltas : LIST_RH.FALTAS >0
se check_Atraso :  LIST_RH.atrasos >0
se check_DSR :  LIST_RH.DSR >0
se check_ADNOT :  LIST_RH.ADNT >0
se check_Extra1 :  LIST_RH.Extra1 >0
se check_Extra2 :  LIST_RH.Extra2 >0

como que monta um LINQ / lambida  com essas condições?

lembrando que as Fixas são com AND    e as condicionais com OR  e as condicionais pode não tem nenhum selecionado.

desde ja agradeo




#497162 - 09/06/2021 15:57:44

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


Membro da equipe
Para casos mais complexos assim, geralmente uso o LinqPad. Facilita bastante.

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


#497163 - 09/06/2021 16:00:34

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


Membro da equipe
Tem também o Linqer. Nele pode simplesmente escrever um SQL normal e ele converte para LinqToSQL

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


#497169 - 09/06/2021 18:49:43

MAXCIM
GUARULHOS
Cadast. em:Dezembro/2003


oi KERPLUNK.  obrigado pelas dicas.

montar o linq eu consegui,  preciso mesmo é como montar no VB as condições.

esse é a Instrução completa do Linq.

dim LINQ = list_RH.where(function(F) (f.Emp_IDEmp=1 AND f.Mes_ref=5 AND f.Ano_ref =2021)
AND (f.TT_falta >0 OR TT_DSR>0 OR f.TT_ATT_Med>0 OR f.atraso  >0 OR f.Add_Not  >0 OR f.HE110 >0) ).tolist

esse linha de baixo, precisa ser montada com base na seleção de um checkbox



#497172 - 09/06/2021 19:27:26

CLEVERTON
SERRINHA
Cadast. em:Dezembro/2003


Membro da equipe
Eu Sinceramente não consegui entender o que vc precisa, sou meio burrinho.

Mas vc quer montar uma query baseado no valor de um  atributo bool ??

Se vc passar um action / Func quando o atributo bool mudar, não atende não ?   (talvez fique menos performático)





#497173 - 09/06/2021 19:38:04

MAXCIM
GUARULHOS
Cadast. em:Dezembro/2003


oi CLEVERTON,

os atributos são valores inteiros,  (quantidades)  desejo filtrar  quando usuário selecionar em um checkbox,

a consulta padrão vai ser essa:
dim LINQ = list_RH.where(function(F) (f.Emp_IDEmp=1 AND f.Mes_ref=5 AND f.Ano_ref =2021)

a medida que for selecionando tipos no checkbox vou filtrando:
selecionou  check_FALTA  aplico filtro padrão +  f.TT_falta >0
selecionou  check_DSR aplico filtro padrão + filtro anterior  +   TT_DSR>0  
selecionou  check_atraso aplico filtro padrão + filtro anterior  +  f.atraso  >0  
selecionou  check_adnot  aplico filtro padrão + filtro anterior  +  f.Add_Not  >0  
selecionou  check_extras aplico filtro padrão + filtro anterior  +  f.HE110 >0

se não selecionou nada,  aplicar apenas filtro padrão



#497174 - 09/06/2021 21:00:23

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


Membro da equipe
Ah... daí é diferente. Para esse tipo de coisa eu usaria o SqlKata e o método When. Ele permite usar condicionais para adicionar ou não algo na query.

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


#497175 - 10/06/2021 07:39:21

LVFIOROT
SERRA
Cadast. em:Março/2012


Última edição em 10/06/2021 07:45:16 por LVFIOROT

aqui usamos isso com o entity para inserir ou não condições na query dinamicamente.

http://www.albahari.com/nutshell/predicatebuilder.aspx
exemplo:

public List<DtoMovel> ListaGeralMovel(int top, string numero, string ddd, string pais, string tpMovel, string operadora, string aparelho, string numeroConta, int idMovel, bool? Excluido)
        {
            using (var db = new ErpGitEntities())
            {
                var predicate = PredicateBuilder.True<DtoMovel>();
                var WhereMovel = PredicateBuilder.True<tb_Movel>();

                if (!string.IsNullOrWhiteSpace(pais))
                    predicate = predicate.And(x => x.Pais.ToString().Contains(pais));

                if (!string.IsNullOrWhiteSpace(numero))
                    predicate = predicate.And(x => x.Numero.Contains(numero));

                if (!string.IsNullOrWhiteSpace(ddd))
                    predicate = predicate.And(x => x.DDD.ToString().Contains(ddd));

                if (!string.IsNullOrWhiteSpace(operadora))
                    predicate = predicate.And(x => x.NomeMovelOperadora.Contains(operadora));

                if (!string.IsNullOrWhiteSpace(tpMovel))
                    predicate = predicate.And(x => x.NomeMovelTipo.Contains(tpMovel));

                if (!string.IsNullOrWhiteSpace(aparelho))
                    predicate = predicate.And(x => x.NomeAparelho.Contains(aparelho));

                if (!string.IsNullOrWhiteSpace(numeroConta))
                    predicate = predicate.And(x => x.NumeroConta.Contains(numeroConta));

                if (idMovel > 0)
                    WhereMovel = WhereMovel.And(x => x.idMovel == idMovel);

                if (Excluido != null)
                    WhereMovel = WhereMovel.And(x => x.Excluido == Excluido);

                var resultado = (from m in db.tb_Movel.Where(WhereMovel)
                                 join tm in db.tb_MovelTipo on m.idMovelTipo equals tm.idMovelTipo

                                 join it1 in db.tb_MovelItemTipo on m.idMovelItemTipo_1 equals it1.idMovelItemTipo into _IT1
                                 from it1 in _IT1.DefaultIfEmpty()

                                 join it2 in db.tb_MovelItemTipo on m.idMovelItemTipo_2 equals it2.idMovelItemTipo into _IT2
                                 from it2 in _IT2.DefaultIfEmpty()
                                 join it3 in db.tb_MovelItemTipo on m.idMovelItemTipo_3 equals it3.idMovelItemTipo into _IT3
                                 from it3 in _IT3.DefaultIfEmpty()
                                 join it4 in db.tb_MovelItemTipo on m.idMovelItemTipo_4 equals it4.idMovelItemTipo into _IT4
                                 from it4 in _IT4.DefaultIfEmpty()
                                 join a in db.tb_MovelAparelho on m.idMovelAparelho_Ativo equals a.idMovelAparelho into _A
                                 from a in _A.DefaultIfEmpty()
                                 join o in db.tb_MovelOperadora on m.idMovelOperadora equals o.idMovelOperadora
                                 where m.idMovel > 0
                                 select new DtoMovel
                                 {
                                     idMovel = m.idMovel,
                                     Pais = m.Pais,
                                     DDD = m.DDD,
                                     Numero = m.Numero,
                                     NumeroConta = m.NumeroConta,
                                     NomeMovelTipo = tm.NomeMovelTipo,
                                     NomeAparelho = a.NomeAparelho,
                                     NomeMovelOperadora = o.NomeMovelOperadora,
                                     NomeMovelItemTipo_1 = it1.NomeMovelItemTipo,
                                     NomeMovelItemTipo_2 = it2.NomeMovelItemTipo,
                                     NomeMovelItemTipo_3 = it3.NomeMovelItemTipo,
                                     NomeMovelItemTipo_4 = it4.NomeMovelItemTipo
                                 }).Where(predicate);

                if (top > 0)
                    return resultado.Take(top).ToList();
                else
                    return resultado.ToList();
            }
        }





#497176 - 10/06/2021 09:17:42

MAXCIM
GUARULHOS
Cadast. em:Dezembro/2003


OI LVFIOROT, bom dia, obrigado pela dica.
estou usando o predicatebuilder, porem estou com problemas na condição OR

não estou sabendo como configurar o predicate para  fazer  and e and ( OR)

preciso de uma maneira o LINQ  aplicar um () nas condiçoes OR

    
Predicate2 = Predicate2.And(Function(x) x.ID_Filial = Cmb_Filial.Tag AND X.Mes_ref=MES AND X.Ano_ref =ANO)

     For Each ItemCK In CheckLB_TP_Oco_Export.CheckedItems
                    If CheckLB_TP_Oco_Export.GetItemCheckState(CheckLB_TP_Oco_Export.Items.IndexOf(ItemCK)) Then
                        If (ItemCK.id = Classes.Class_POO_QH.en_TP_Oco.Faltas) Then
                            Predicate2 = Predicate2.Or(Function(o) o.TT_Faltas > 0)
                        ElseIf (ItemCK.id = Classes.Class_POO_QH.en_TP_Oco.Atrasos) Then
                            Predicate2 = Predicate2.Or(Function(o) o.Atraso.Ticks > 0)
                        ElseIf (ItemCK.id = Classes.Class_POO_QH.en_TP_Oco.DSR) Then
                            Predicate2 = Predicate2.Or(Function(o) o.TT_DSR > 0)
                        ElseIf (ItemCK.id = Classes.Class_POO_QH.en_TP_Oco.Ad_Noturno) Then
                            Predicate2 = Predicate2.Or(Function(o) o.Add_Not.Ticks > 0)
                        ElseIf (ItemCK.id = Classes.Class_POO_QH.en_TP_Oco.Extra1) Then
                            Predicate2 = Predicate2.Or(Function(o) o.HE70.Ticks > 0)
                        ElseIf (ItemCK.id = Classes.Class_POO_QH.en_TP_Oco.Extra2) Then
                            Predicate2 = Predicate2.Or(Function(o) o.HE110.Ticks > 0)
                        End If
                    End If
                Next

linq2 = List_QH_Per.Where(Predicate2.Compile())




#497190 - 11/06/2021 11:31:14

CLEVERTON
SERRINHA
Cadast. em:Dezembro/2003


Membro da equipe
Isso não resolve não ?

from m in ctx.Seumodel where (m.Selecionado ?  CondicaoA : true) select m;

OU

from m in ctx.Seumodel where (m.Selecionado ?  CondicaoA : CondicaoB) select m;




#497191 - 11/06/2021 11:38:26

CLEVERTON
SERRINHA
Cadast. em:Dezembro/2003


Membro da equipe
Citação:
os atributos são valores inteiros,  (quantidades)  desejo filtrar  quando usuário selecionar em um checkbox,


Um Complemento:
Lembrando, que pra isso funcionar em tempo de execução. Tem que passar um BindingSource para o grid, e deve ser implementado a Interface a INotifyPropertyChanged. Usando  nos campos que vc quer que mude o valor dinamicamente



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


Para responder este tópico o login é requerido
Se você já possui uma conta de usuário por favor faça seu login
Se você não possui uma conta de usuário use a opção Criar usuário