none
Como usar Linq com variável dinâmica na cláusula "Where" por reflexão RRS feed

  • Pergunta

  • Olá pessoal,

          Como eu faço para inserir a seguinte variável que contém o nome de um campo de minha tabela, na clausula WHERE do linq ??

    string varCampo= "Campo1"
    
    var lista = db.tabela1.Where( x=> varCampo.equals("Paula") ?????

    Abraços

         

    domingo, 23 de fevereiro de 2014 18:39

Respostas

  • Exatamente isso.

    Eu utilizo essa biblioteca para fazer filtros dinâmicos em formulários, dessa maneira posso fazer um select por exemplo já com um filtro preparado:

    <select>
       <option value="NumBanco = 341">Banco Itaú</option>
    </select>


    • Marcado como Resposta Professional MVC quarta-feira, 26 de fevereiro de 2014 13:31
    quarta-feira, 26 de fevereiro de 2014 02:52
    Moderador

Todas as Respostas

  • Pode tentar assim

    var lista =db.tabela1.Where(x=>x.campo=="john lennon").ToList();

    domingo, 23 de fevereiro de 2014 23:13
  • Olá,

    Se você estiver usando DataTable, pode tentar assim:

    var lista =db.tabela1.Where(row=> row("NomeCampo") =="Paula").ToList();

    Espero ter ajudado.

    Abraços.

    segunda-feira, 24 de fevereiro de 2014 00:51
  • Bom dia Richof,

        Obrigado pela resposta.  

         Infelizmente no exemplo que você citou, não funcionaria pra mim, tendo em vista que o nome do  "campo" está dentro de uma variável conforme o exemplo que citei acima.  

          Você não teria outro exemplo?

    Abraços

      

         

    segunda-feira, 24 de fevereiro de 2014 13:38
  • Olá Piratazzz

         Valeu pela resposta, mas eu não estou usando DataTable.

         Até agora pelo que eu li, a única maneira de eu conseguir êxito, passando o nome do campo de minha tabela através de uma variável no método, seria através de reflection com Linq, mas infelizmente não estou conseguindo êxito.

          Você poderia me ajudar nessa questão??

    Abraços

          

          

    segunda-feira, 24 de fevereiro de 2014 13:42
  • Uma solucao pode ser:

    string campo="campo1";
    List<Tabela1> lista= new List<Tabela1>;
    switch(campo)
    {
    case:"campo1"
     lista=db.tabela1.Where(x=>x.campo1=="john lennon").ToList();
    Break;
    case: "campo2"
     lista =db.tabela1.Where(x=>x.campo2=="john lennon").ToList();
    Break;
    .
    .
    .
    .
    .}
    

    Pode dar algum erro porque estou no tablet, mas a ideia e essa

    Tambem da uma olhada neste link

    http://forums.asp.net/t/1879971.aspx?How+to+build+dynamic+lambda+expression+using+linq+in+c+net

    Boa sorte :-)

    segunda-feira, 24 de fevereiro de 2014 16:05
  • Ola Richof,

           Essa sua sugestão resolve o meu problema, mas como eu não sei qual será o campo (pois tenho 15 campos que terão que passar por essa avaliação), não teria uma outra forma genericamente falando, em que essa averiguação pudesse ser feita ??

    Abraços

    segunda-feira, 24 de fevereiro de 2014 17:58
  • Você pode usar uma extensão do Linq chamada DynamicLibrary e fazer suas queries via string.

    Segue o código da classe: 

    https://gist.github.com/jmprado/9195576

    Para usar é simpes, basta criar uma string com a expressão Linq que vc precisa utilizar:

    var query = (from c in Produto.Where("NomeCampo == " + valorCampo) select c).ToList();
    Assim vc pode trabalhar com strings ao invés de ser obrigado a recorrer a propriedades especificas dos campos. Só um lembrete, isso abre margem para bugs pois qualquer erro no nome do campo na string vai obviamente gerar uma exceção ao usar a extensão.

    segunda-feira, 24 de fevereiro de 2014 19:50
    Moderador
  • Boa tarde,

    Ainda acho que o "switch" e uma solucao, porem, aqui deixo um artigo que achei interessante

    http://www.codeproject.com/Articles/171749/The-Workings-of-Dynamic-Lambda-in-LINQ  

    Boa sorte :-)

    segunda-feira, 24 de fevereiro de 2014 20:27
  • Valeu Richof, vou dar uma olhada nesse link e retorno logo em seguida com minhas conclusões ok?

    Abraços

    segunda-feira, 24 de fevereiro de 2014 20:43
  • Boa tarde João_Prado, muito obrigado por sua atenção.

    Deixa eu te perguntar uma coisa,  eu trabalho com ASP.NET MVC 4 e RAZOR, se as versões destas ferramentas mudarem ou eu migrar para versões superiores, eu teria que dar manutenção nessa classe DynamicLibrary  ???

    segunda-feira, 24 de fevereiro de 2014 20:46
  • Veja as dependências da classe, nenhuma envolve MVC ou razor:

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Linq;
    using System.Linq.Expressions;
    using System.Reflection;
    using System.Reflection.Emit;
    using System.Threading;
    

    Não há nenhum impedimento em utilizar inclusive a mesma para .net 3.5 e .net 4 por exemplo. Basta compilar a classe para o framework correspondente.

    Talvez no futuro mude alguma dependência (namespace), afora isso creio que vc não terá problemas em utilizar o código.

    Bom desenvolvimento.

    segunda-feira, 24 de fevereiro de 2014 23:40
    Moderador
  • Ok João_Prado,

        Mais uma vez muito obrigado pela paciência e atenção em responder a minha questão.

        Antes de fechar o post, vou estudar o Dynamic Query Library e dar um retorno pra vocês aqui.

        Se eu entendi bem e como eu passo o nome do campo através de parâmetro, o meu método ficaria assim usando a biblioteca?? :

    public ActionResult Buscar( string field, string value){
    
        var query = db.Produto.Where(field + "==" + value).ToList();
    
    ...
    
    }
    Abraços

        

         

    terça-feira, 25 de fevereiro de 2014 15:36
  • Exatamente isso.

    Eu utilizo essa biblioteca para fazer filtros dinâmicos em formulários, dessa maneira posso fazer um select por exemplo já com um filtro preparado:

    <select>
       <option value="NumBanco = 341">Banco Itaú</option>
    </select>


    • Marcado como Resposta Professional MVC quarta-feira, 26 de fevereiro de 2014 13:31
    quarta-feira, 26 de fevereiro de 2014 02:52
    Moderador
  • Valeu João.

    Já estou estudando esse DLL.

    Abraços e fique na paz!!!

    quarta-feira, 26 de fevereiro de 2014 13:31
  • Depois volte ao fórum e diga se funcionou como previsto ok?

    Abraço e bom desenvolvimento

    quarta-feira, 26 de fevereiro de 2014 20:45
    Moderador
  • Pode deixar, retorno sim.

    João, como é a performance do sistema ao utilizar essa biblioteca??

    Abraços

    quarta-feira, 26 de fevereiro de 2014 22:12
  • Você pode usar uma extensão do Linq chamada DynamicLibrary e fazer suas queries via string.

    Segue o código da classe: 

    https://gist.github.com/jmprado/9195576

    Para usar é simpes, basta criar uma string com a expressão Linq que vc precisa utilizar:

    var query = (from c in Produto.Where("NomeCampo == " + valorCampo) select c).ToList();
    Assim vc pode trabalhar com strings ao invés de ser obrigado a recorrer a propriedades especificas dos campos. Só um lembrete, isso abre margem para bugs pois qualquer erro no nome do campo na string vai obviamente gerar uma exceção ao usar a extensão.

    Olá João,

          Você existe um site oficial para a gente baixar essa DLL onde a gente possa estar recorrendo em possíveis atualizações da mesma?

    sábado, 1 de março de 2014 21:58
  • Olá Professional,

    Cara, eu baixei esse código há muito tempo se não me engano foi no github ou em um post do Scott Hanselman.

    Você pode usar também via nuget:

    http://www.nuget.org/packages/System.Linq.Dynamic/

    domingo, 2 de março de 2014 21:05
    Moderador
  • Cara legal, pelo nuget fica uma coisa mais confiável né?

    Valeu João!!!

    A propósito João, se for possível e não for incomodo, gostaria que você me desse uma força em uma questão que postei antes de ontem aqui no fórum se não me engano, sobre exportação de arquivo texto.  Já agradeço antecipadamente.

    Grande abraço e fique na paz!!!

    segunda-feira, 3 de março de 2014 15:40
  • Olá João, ainda em tempo....

    Na leitura que fiz, se eu baixar pelo http://    , ele sé atende o .NET 4.0, mas se eu baixar o arquivo que você me sugeriu ou seguir a orientação feita  nesse link http://stackoverflow.com/questions/20789491/dynamicexpression-parselambda-in-net-4-5,  é melhor, porque é como você havia me dito anteriormente, é só compilar na versão do meu .NET que fica tudo certo.

    segunda-feira, 3 de março de 2014 15:51