Pequeno Tutorial de LINQ
Autor: Theo Alexandre Miliani | Publicado: 2012-05-24T05:09:00-07:00

Inicialmente quero agradecer ao Hussein e ao Hugo da Lista .Net-Br...Valeu mesmo pelos elogios...isso me motiva a colocar cada vez mais postagens.

Eu por muitos anos so usava o SQL, meu berço de aprendizagem de programação foi no meio de Selects interminaveis, com inner joins e wheres
De repente veio o Linq, na internet nao tem nada que explique muito bem ele, nao de forma que eu consiga entender, no maximo encontrei um programa que converte SQL em Linq com 90% ou 95% de acerto, o que ja ajuda demais, o nome desse programa é Linqer porem o mesmo é pago, não existem formas de crackear, o que seria ate mesmo injusto tamanha a eficiencia dele perto do preço.
O Linq traz uma forma de tratar o banco de dadosque me agradou muito, que foi a portabilidade, quantas vezes eu tive que sair caçando SQLs que pararam de funcionar porque saiu do Access pro MySql ou do MySql pro SqlServer e ate mesmo pro Oracle?
Com o Linq acabou isso tudo, e a forma que ele trata as queries torna a coisa mais facil para se programar, o Visual Studio integra todo mundo perfeitamente, e com pouca coisa ja se sai programando normalmente conseguindo uma produção normal em qualquer cenario de trabalho.

Inicialmente devemos instanciar o banco de dados na classe que sera criado a querie Linq, Vou dar como exemplo a forma que eu instancio, lembrando que nesse exemplo eu estou usando o Linq to Entities

[Atualização = Observação muito bem vinda do Bernardo do grupo .Net-Br usar o using ao invez de declarar direto como eu fiz, faz que o dispose seja automatico]
using BancoEntities BD = new BancoEntities();

Caso nao saiba fazer uma conexao de exemplo, aqui mesmo no blog eu ja postei sobre como fazer uma conexão com o MySql

Num banco de dados de exemplo poderiamos colocar as tabelas:
TbFuncionarios
FuncId - Int - Pk
FuncNom - VarChar - 50 Caracteres
FuncEnd - VarChar - 100 Caracteres

TbHorarios
HorId - Int - Pk
FuncId - Int - Fk
HorManha - Hora
HorTarde - Hora
HorDat - Data

Não vou me ater muito a modelagem porque esse não é o proposito do post, e para o aprendizado essas duas tabelas ja estao bem, veja que temos um relacionamento de um para muitos (um funcionario muitos horarios)

Vamos Iniciar com um select simples na tabela de funcionarios
Sql =&gt; Select FuncId, FuncNom, FuncEnd from tbFuncionarios
Linq =&gt; from Listagem in BD.tbFuncionarios select new {Listagem.FuncId, Listagem.FuncNom, Listagem.FuncEnd}

Sql =&gt; Select * from tbFuncionarios
Linq =&gt; from Listagem in BD.tbFuncionarios select Listagem

lembrando que usar o * em SQLs prejudica a performance porque o comando tem que ir na tabela central do banco de dados achar quem sao todos os campos da tabela em questao para so depois dar select nelas, ja no Linq isso nao ocorre porque ele ja tem a referencia pelo Entities.

ja um select com where:
Sql=&gt; Select FuncId, FuncNom, FuncEnd from tbFuncionarios where FuncNom = 'XXX'
Linq=&gt; from Listagem in BD.tbFuncionarios where Listagem.FuncNom == 'XXX' select new {Listagem.FuncId, Listagem.FuncNom, Listagem.FuncEnd}

Por estarmos lidando com uma linguagem tipada é bom não esquecer de que as comparações do where sao obrigatoriamente do mesmo tipo ou seja string == string, int==int, e assim por diante, frisando bem CHAR NAO É IGUAL VARCHAR, INT NAO É IGUAL A DOUBLE
Mas nao estamos a beira do precipicio nesse sentido, porque vc pode usar os casts ou seja o .ToString() e assim por diante, o importante é que na comparação final os tipos estejam devidamente igualados, senão nao funciona

e que tal com o order by?
SQL=&gt; Select FuncId, FuncNom, FuncEnd from tbFuncionarios order by FuncNom
Linq=&gt;from Listagem in BD.tbFuncionarios order by Listagem.FuncNom select new {Listagem.FuncId, Listagem.FuncNom, Listagem.FuncEnd}

agora algo que revirei por horas por algo entendivel na net e nao achei, e muita mas muita gente mesmo tem essa duvida que é o famoso inner join
SQL=&gt; Select FuncId, FuncNom, FuncEnd, tbHorarios.HorManha from tbFuncionarios inner join tbHorarios on tbHorarios.FuncId = Funcionarios.FuncId&nbsp; order by FuncNom
Linq=&gt; from Listagem in BD.tbFuncionarios
&nbsp;join ListaHoras in BD.tbHorario on Listagem.FuncId equals ListaHoras.FuncId 
&nbsp;select new {Listagem.FuncId, Listagem.FuncNom, Listagem.FuncEnd, ListaHoras.HorManha}

Lembrando mais uma vez que deve se igualar os tipos.
Espero ter ajudado
Ate mais!