Usuário com melhor resposta
Como usar Linq com variável dinâmica na cláusula "Where" por reflexão

Pergunta
-
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
Todas as Respostas
-
-
-
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
-
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
-
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+netBoa sorte :-)
-
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
-
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.
-
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 :-)
-
-
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 ???
-
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.
-
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
-
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
-
-
-
-
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?
-
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/
- Editado João_ PradoModerator domingo, 2 de março de 2014 21:07
-
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!!!
-
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.