O documento introduz o LINQ no C#, permitindo criar consultas a dados usando linguagens .NET através de sintaxe de consulta e métodos de extensão. Exemplos mostram como filtrar e ordenar arrays e transformar dados em XML usando LINQ. O documento também explica conceitos como execução diferida, tipos de dados suportados e provedores LINQ para diferentes origens de dados.
3. O que é o LINQ
"Language Integrated Query"
Adicionado ao .Net em 2007
Permite criar consultas a dados utilizando as
linguagens suportadas pelo .Net Framework
Inspirado em SQL e Haskell
4. Exemplo de Consulta
string[] linguagens = new string[5] { "C#",
"VB", "Javascript", "C++", "F#" };
var nomesCurtos =
from li in linguagens
where li.Length < 4
select li;
foreach (string nome in nomesCurtos)
{
Console.WriteLine(nome);
}
C#
VB
C++
F#
5. Data Source
string[] linguagens = new string[5] {
"C#",
"VB",
"Javascript",
"C++",
"F#"
};
Array
IEnumerable<T>
apenas em runtime
6. Query
var nomesCurtos =
from li in linguagens
where li.Length < 4
select li;
inferência de tipo
fonte dos dados
filtragem
tipo do retorno
Até este momento, a consulta não é executada, e
nenhum dado é retornado!
7. Deferred Execution
foreach (string nome in nomesCurtos)
{
Console.WriteLine(nome);
}
Execução da consulta ocorre ao iterar pelo objeto de
consulta em um foreach.
16. Operações de Consulta
Obtenção de dados:
var queryClientes = from cli in clientes
select cli;
Filtragem:
var queryClientes = from cli in clientes
where cli.Saldo < 0
select cli;
...
var queryClientes = from cli in clientes
where cli.Saldo < 0 && cli.Idade < 26
select cli;
17. Operações de Consulta 2
Ordenação:
var queryClientes = from cli in clientes
where cli.Saldo < 0 && cli.Idade < 26
orderby cli.Cidade
select cli;
Agrupamento:
var queryClientes = from cli in clientes
group cli by cli.Cidade;
Aqui, queryClientes é do tipo
IEnumerable<IGrouping<string, Cliente>>
18. Operações de Consulta 3
Agrupamento (cont.):
//...
foreach (var groupClientes in queryClientes)
{
Console.WriteLine(groupClientes.Key);
foreach (Cliente cliente in groupClientes)
{
Console.WriteLine("--- {0}", cliente.Nome);
}
} Aqui, groupClientes é do tipo
IGouping<string, Cliente>
19. Operações de Consulta 4
Agrupamento 2:
var queryClientes =
from cli in clientes
group cli by cli.Cidade into cliGroup
where cliGroup.Count() > 2
orderby cliGroup.Key
select cliGroup;
20. Transformação de dados
Subsetting:
var queryClientes =
from cli in clientes
select new {
NomeCliente = cli.Nome,
Area = cli.Area
};
foreach (var cli in queryClientes)
{
Console.WriteLine(cli.NomeCliente + ", " + cli.Area);
}
Tipo Anônimo
21. Transformação de dados 2
Junção:
var juncaoClienteVendedor =
from cli in clientes
join vend in vendedores on cli.Area equals vend.Area
select new { NomeCliente = cli.Nome, NomeVendedor =
vend.Nome };
22. Transformação de dados 3
Criação de XML:
var studentsToXML =
new XElement("Root",
from student in students
let x = String.Format(
"{0},{1},{2},{3}",
student.Scores[0],
student.Scores[1],
student.Scores[2],
student.Scores[3])
select new XElement("student",
new XElement("First", student.First),
new XElement("Last", student.Last),
new XElement("Scores", x)));
23. Transformação de dados 4
Criação de XML(cont.) - Resultado :
<Root>
<student>
<First>Svetlana</First>
<Last>Omelchenko</Last>
<Scores>97,92,81,60</Scores>
</student>
<student>
<First>Claire</First>
<Last>O'Donnell</Last>
<Scores>75,84,91,39</Scores>
</student>
<student>
<First>Sven</First>
<Last>Mortensen</Last>
<Scores>88,94,65,91</Scores>
</student>
</Root>
24. Providers e API's
- LINQ To Objects
- LINQ To XML
- LINQ To SQL
- LINQ To Datasets
- LINQ To Entities
- LINQ To Google Search
- LINQ To Twitter
- LINQ To Wikipedia
- LINQ To NHibernate
- LINQ To Windos Search
...
25. Estendendo LINQ
Dados em memória:
- implementar IEnumerable<T>
Dados remotos:
- implementar IQueryable<T>
Criando um Provider remoto:
- implementação requerida: IQueryable<T>,
IOrderedQueryable<T> e IQueryProvider
* cuidado com performance na implementação!
26. Referências
Portal do LINQ no MSDN: http://bit.ly/11X5kXz
Artigo na Wikipedia: http://bit.ly/18MpCF
LINQ To Entities: http://bit.ly/13w0fqW
LINQ To Google: http://glinq.codeplex.com/
LINQ To Windos Search: http://bit.ly/117CLCW
LINQ To Twitter: http://bit.ly/dzrHjQ
27. Referências 2
Lambda Calculus: http://bit.ly/3LBzDJ
Lambda no C#: http://bit.ly/SakjXd
Extension Methods: http://bit.ly/SakjXd
Tipos anônimos: http://bit.ly/10ntsDI
Inferência de tipo: http://bit.ly/6puEY4