none
Where no LINQ RRS feed

  • Pergunta

  • Boa tarde Pessoal

    Comecei a usar meio recentemente o Entity Framework 4.0 e LINQ.

    Estou com dificuldade para fazer o seguinte:

    Tenho um método que deve fazer uma pesquisa em uma tabela, contendo um JOIN em outras duas... até ai, tranquilo.

    Problema: Esse método pode usar ou não 4 parâmetros... e eu queria criar o WHERE de acordo com esses parâmetros, mas uns podem ser NULL e outros não...
    Vou colar o exemplo aqui:

     

    Public Function Listar() As List(Of TimeSheetWeb.CONTRATOS)
    
          Dim Qcontratos As System.Linq.IQueryable
    
          Try
    
            Dim M As New EntidadesContainer(Me.Con.ConexaoAtiva)
    
            Dim listContratos As List(Of TGestiona.TimeSheetWeb.CONTRATOS)
    
            Qcontratos = (From C In M.CONTRATOS _
                     Join e In M.EMPRESAS On _
                     e.ID Equals C.ID_EMPRESA _
                    Join Cl In M.CLIENTES _
                    On C.ID_CLIENTE Equals Cl.ID
    
            'Monta o Where
            Dim where As String = String.Empty
    
            If Me.dtContrato <> Nothing Then
              'where = " C.DT_CONTRATO = " & Me.dtContrato
            End If
    
            If Me.REFERENCIA <> String.Empty Then
              If where = String.Empty Then
                where = " C.REFERENCIA = " & Me.strReferencia
              Else
                where &= " AND C.REFERENCIA = " & Me.strReferencia
              End If
            End If
    
            If Me.intIdCliente = 0 Then
              If where = String.Empty Then
                where = "C.ID_CLIENTE = " & Me.intIdCliente
              Else
                where &= " AND C.ID_CLIENTE = " & Me.intIdCliente
              End If
            End If
    
            If Me.intIdEmpresa = 0 Then
              If where = String.Empty Then
                where = "C.ID_EMPRESA = " & Me.intIdEmpresa
              Else
                where &= " AND C.ID_EMPRESA = " & Me.intIdEmpresa
              End If
            End If
    

     Bom, não sei se deu pra entender.
    Mas caso as variáveis fossem diferentes de String.Empty, queria colocar o parâmetro na Query... Ou seja, tem que ir montando o Where que vai na variável Qcontratos (do tipo IQueryable).

    Alguém poderia me dar um HELP ??

     

    quinta-feira, 2 de setembro de 2010 21:03

Respostas

Todas as Respostas

  • Prezado,

    Já tentou um QContratos.Where(where) ?


    André Alves de Lima
    Visite o meu site: http://andrealveslima.spaces.live.com
    Me siga no Twitter: @andrealveslima
    sexta-feira, 3 de setembro de 2010 00:13
    Moderador
  • Prezado(a),

    Estou migrando seu post para o fórum de LINQ.

    Por favor, das próximas vezes que for postar alguma dúvida referente a esse assunto, poste por lá.

    Obrigado.


    André Alves de Lima
    Visite o meu site: http://andrealveslima.spaces.live.com
    Me siga no Twitter: @andrealveslima
    sexta-feira, 3 de setembro de 2010 00:14
    Moderador
  • André,

    Obrigado pela dica, fiquei meio perdido no forum mesmo.

    Então..

    Tentei esse .Where que vc disse, até existe , mas quando abro os parenteses, não consigo colocar parâmetro em campo algum.
    Por exemplo, não consigo fazer Qcontratos.Where(C.ID_CLIENTE = 10)... pois não reconhece mais as tabelas...

    O fato de ser VB influi ?

    sexta-feira, 3 de setembro de 2010 12:12
  • Prezado,

    Realmente, as tabelas não serão identificadas nesse caso mesmo... Vou tentar simular seu cenário aqui e ver se acho uma solução...


    André Alves de Lima
    Visite o meu site: http://andrealveslima.spaces.live.com
    Me siga no Twitter: @andrealveslima
    sexta-feira, 3 de setembro de 2010 12:36
    Moderador
  • Olá, segue um ex

     public IList<EquipmentType> Get( int? equipmentTypeID , bool? deleted , string name )
        {
          var query =
            FactoryData<EquipmentType>.Data.Fetch().Where(
              equipmentType =>
              ( ( equipmentTypeID == null ) || ( equipmentType.EquipmentTypeID == equipmentTypeID ) )
              && ( ( deleted == null ) || ( equipmentType.Deleted == deleted ) )
              && ( ( String.IsNullOrEmpty( name ) ) || ( equipmentType.Name.Contains( name ) ) ) );
    
          return query.ToList();
        }

    sexta-feira, 3 de setembro de 2010 14:09
  • Seilor,

    Seu exemplo é muito bom cara! Deu pra dar uma clareada nas idéias aqui.

    Porém, do jeito que vc aplicou esse exemplo, acho que não me serviria, pelo seguinte:

    Supondo que eu recebesse apenas o parâmetro equipmentTypeID , e quisesse usa-lo como critério de busca, como vc faz ai em cima. Só que, ao pesquisar somente pelo equipmentTypeID os outros campos irão entrar no WHERE como null... correto ?

    Ou seja, só irei trazer os registros onde o equipmentTypeID fosse o que eu passei e as outras colunas fossem NULL... não é isso?!

    É que no meu caso, embora passando somente um parâmetro, precisaria trazer os registros onde os outros 2 parâmetros não passados não fossem NULL...

    sexta-feira, 3 de setembro de 2010 15:56
  • Olá,

    Talvez no seu caso o melhor seria montar uma consulta dinâmica, dê uma olhada neste post e veja se te ajuda:
    http://carloscds.net/2010/07/consultas-genricas-com-linq/

    []s,


    Carlos dos Santos - www.carloscds.net
    segunda-feira, 6 de setembro de 2010 01:20