domingo, 28 de setembro de 2008

Queries Dinâmicas com LINQ

Recentemente fui implementar um exemplo simples de queries dinâmicas no LINQ, e me deparei com um grande obstáculo. “Queries dinâmicas” são aquelas que criamos em tempo de execução, geralmente com a concatenação de strings.

Pense numa aplicação que o usuário escolha dinamicamente os campos que vão fazer parte do filtro da sua pesquisa. Essa é uma necessidade muito comum, e com as classes convencionais do ADO.NET e comandos SQL, essa é uma tarefa bastante simples.

Como sabemos, no LINQ criamos nossas queries no próprio código (C# / VB.NET), onde databases, tabelas e campos são objetos fortemente tipados. É consenso geral que essa é a grande benesse do LINQ, e fator principal do seu sucesso. Porém em cenários de queries dinâmicas, como o citado acima, temos um sério problema.

A primeira solução que encontrei para este problema, de cara não me agradou muito, dada a sua complexidade. A idéia é “construir” a query LINQ em Lambda Expressions, que podem ser feitas em tempo de execução, de acordo com os parâmetros definidos.

Não vou entrar em detalhes em como fazer isso, mas deixo aqui um ótimo artigo do Renato Guimarães sobre esse assunto:
http://renatoguimaraes.spaces.live.com/Blog/cns!256AF1F8919FD3B1!1251.entry. E outro do Joseph Albahari: http://www.albahari.com/nutshell/predicatebuilder.aspx.

Com um pouco mais de pesquisa, encontrei uma solução bem mais adequada para o problema: O LINQ Dynamic Query Library.

Isso na verdade, é uma pequena biblioteca construída pela galera de desenvolvimento do LINQ na Microsoft, que permite a criação de queries LINQ dinâmicas, com a concatenação de strings.

Essa biblioteca é distribuída em um pacote de exemplos que você pode baixar para C#:
http://msdn.microsoft.com/en-us/vcsharp/bb894665.aspx

Ou VB.NET:
http://msdn.microsoft.com/en-us/vbasic/bb964686.aspx

Em ambos os pacotes você vai encontrar um diretório chamado DynamicQuery que contém um exemplo de como utilizar esse pacote.

Para você ter uma idéia de como funciona o LINQ Dynamic Query Library, o que você faz tradicionalmente com LINQ, assim:



Com as queries dinâmicas você pode fazer assim:


Caiu como uma luva para o problema que eu precisava resolver. Além desse pacote, nos downloads citados acima você vai encontrar uma séria de exemplos úteis para LINQ.

Confira também este post do Scott Guthrie sobre o assunto:
http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

Grande Abraço e até a próxima!

quinta-feira, 11 de setembro de 2008

Dia do Programador

Hoje é dia do Programador!


E não adianta dizer que somos Analistas, Arquitetos, Engenheiros, Desenvolvedores, Dev, etc... Nós somos Programadores, e parabéns a nós!

Tá certo que até ontem eu nem sabia da existência desse dia. Foi um amigo programador que me avisou em um e-mail. Valeu pela dica Paulo! A razão da data é óbvia (para nós), hoje é o 256º dia do ano! Aos que não se ligaram 2^8=256. Se ainda não entendeu ta na área errada (rsrsrs).

Essa é uma perfeita referência ao sistema binário, que se não fosse por ele hoje estaríamos apagando algum incêndio, prendendo algum bandido, fazendo uma traqueostomia, ou ainda pior, concorrendo a vereador para a cidade de São Paulo. Aliás, se alguém conhecer algum programador que for candidato, me avisa por favor! Com as opções que temos, ele com certeza vai ter o meu voto!

No Brasil poucos sabem e comemoram essa data. Ela é originalmente comemorada lá fora, onde nossos colegas costumam a se comportar de uma forma um tanto quanto estranha: codificando programas inúteis, jogando games antigos, brincando com velhos computadores, etc.

Não adianta, profissional de TI é estranho em qualquer lugar mesmo, não é privilégio nosso não. Quer a prova, assista ao seriado “The IT Crowd” (
http://www.channel4.com/entertainment/tv/microsites/I/itcrowd/). Indicação do meu grande amigo Rodolfo - futuro programador.

Mas como disse um outro amigo programador: “essa comemoração deles é meio gay, você não acha?”. Concordo com você Luciano! Prefiro comemorar a lá Brasil, no happy hour do final da tarde! Mesmo porque se meu chefe me pegar jogando space invaders, nessa altura do projeto, tô na roça!

Mas como essa lei seca ta pegando forte, o negócio é comemorar em casa mesmo. Uma dica são as cervejas importadas, uma benção do Deus Marduk, que estão disponíveis a preços módicos no supermercado mais próximo! A dica é do meu amigo Rob (antigo programador), confira aqui no blog dele:
http://vidadigitao.blogspot.com/2008/08/pare-de-sofrer.html. Nessa lista de beldades apresentada por ele eu só acrescentaria a minha favorita, Guinnes.

Só não vá se esquecer de uma coisa muito importante: Esse ano é bissexto!

Grande Abraço e até a próxima!

terça-feira, 9 de setembro de 2008

LINQPad

Recentemente, na coluna .NET Brasil que escrevo na .NET Magazine falei um pouco sobre o dilema de se escrever queries em LINQ, e como podemos nos acostumar a essa nova forma de se fazer pesquisas no banco de dados.

Se você nunca ouviu falar do LINQ, segue uma breve definição: Esta é a sigla para Language Integrated Query que é uma linguagem integrada ao C# e VB.NET para a execução de queries. A idéia é substituir o uso da linguagem SQL por uma linguagem compatível, semelhante e integrada ao código gerenciado .NET.

A partir do momento em que você vai colocando em prática o LINQ em suas aplicações, surge um dilema sério: Como nos acostumar a escrever queries em LINQ, já que estamos tão acostumados a escrever comandos em SQL?

As diferenças não são tão grandes assim, mas há uma mudança considerável na ordem em que escrevemos os comandos. O que antes escrevíamos assim:

Agora escrevemos assim (C#):



Veja que primeiro vem o FROM, em seguida o WHERE e o ORDERBY e só no final é que vem a clausula SELECT. Com essa inversão das cláusulas, ganhamos o benefício do intelisense, na hora de escolher os campos que serão retornados pela consulta.

Não é fácil para quem está começando e já é acostumado com o jeito antigo. Uma ferramenta essencial nesse momento é o LINQPad, do Joseph Albahari. É uma ferramenta gratuita que você pode baixar a partir deste link: http://www.linqpad.net/

No LINQPad podemos criar conexões com nossos databases e executar consultas utilizando a linguagem LINQ. Seria o equivalente à ferramenta de queries que temos no SQL Server Management Studio. Veja na figura abaixo um exemplo de query executada no LINQPad:


Essa é sem dúvida uma ferramenta obrigatória para quem está começando no LINQ, não deixe de baixar e utilizar!

Grande Abraço e até a próxima!