Usuário com melhor resposta
Where no LINQ

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 ??
- Movido AndreAlvesLimaModerator sexta-feira, 3 de setembro de 2010 00:14 (De:.NET Development - Geral)
Respostas
-
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- Sugerido como Resposta Felipe Marciano segunda-feira, 20 de setembro de 2010 11:53
- Marcado como Resposta AndreAlvesLimaModerator terça-feira, 5 de outubro de 2010 01:29
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 -
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 -
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 ?
-
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 -
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(); }
-
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...
-
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- Sugerido como Resposta Felipe Marciano segunda-feira, 20 de setembro de 2010 11:53
- Marcado como Resposta AndreAlvesLimaModerator terça-feira, 5 de outubro de 2010 01:29