SlideShare une entreprise Scribd logo
1  sur  29
Télécharger pour lire hors ligne
Introdução ao LINQ no C#
Facilitador
Fernando Padoan
Engenheiro de Sistemas
http://www.cesar.org.br/
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
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#
Data Source
string[] linguagens = new string[5] {
"C#",
"VB",
"Javascript",
"C++",
"F#"
};
Array
IEnumerable<T>
apenas em runtime
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!
Deferred Execution
foreach (string nome in nomesCurtos)
{
Console.WriteLine(nome);
}
Execução da consulta ocorre ao iterar pelo objeto de
consulta em um foreach.
Execução Imediata
int quantos = nomesCurtos.Count();
Outros exemplos:
.ToArray(), .ToList(), .First()...
Tipos de Dados
"Queryable data types":
IEnumerable
IEnumerable<T>
IQueryable<T>
... ou qualquer outro tipo que implemente
IEnumerable<T>.
Tipos de Dados na Consulta
IEnumerable<string> nomesCurtos =
from li in linguagens
where li.Length < 4
select li;
Mais exemplos:
Query vs. Method Syntax
int[] numeros = { 1, 2, 3, 5, 8, 13, 21, 34
};
IEnumerable<int> pares = // query???
foreach (int i in pares)
{
Console.Write(i + " ");
}
Query Syntax
IEnumerable<int> pares =
from num in numeros
where num % 2 == 0
orderby num
select num;
Method Syntax
IEnumerable<int> pares = numeros.Where(num
=> num % 2 == 0).OrderBy(n => n);
Extension methods
Lambda expressions
LINQ Extension Methods
namespace System.Linq
{
public static class Enumerable
{
// ...
public static IEnumerable<TSource> Where<TSource>(
this IEnumerable<TSource> source,
Func<TSource, bool> predicate)
// ...
}
// ...
}
Lambda Expressions
"num => num % 2 == 0"
"n => n"
"Func<TSource, bool> predicate"
"=>" : "goes to"
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;
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>>
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>
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;
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
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 };
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)));
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>
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
...
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!
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
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
Perguntas?
Obrigado!

Contenu connexe

En vedette

En vedette (11)

ASP .NET MVC na Prática - C. Augusto Proiete
ASP .NET MVC na Prática - C. Augusto ProieteASP .NET MVC na Prática - C. Augusto Proiete
ASP .NET MVC na Prática - C. Augusto Proiete
 
Desenvolviemento web com ASP.Net e MVC
Desenvolviemento web com ASP.Net e MVCDesenvolviemento web com ASP.Net e MVC
Desenvolviemento web com ASP.Net e MVC
 
Desvendando ASP.NET MVC
Desvendando ASP.NET MVCDesvendando ASP.NET MVC
Desvendando ASP.NET MVC
 
Criar um sistema com asp net
Criar um sistema com asp netCriar um sistema com asp net
Criar um sistema com asp net
 
Boas práticas de programação em C# .NET
Boas práticas de programação em C# .NETBoas práticas de programação em C# .NET
Boas práticas de programação em C# .NET
 
.NET e C# - Introdução Geral
.NET e C# - Introdução Geral.NET e C# - Introdução Geral
.NET e C# - Introdução Geral
 
Sistema Controle de Estoque ASP.NET
Sistema Controle de Estoque ASP.NETSistema Controle de Estoque ASP.NET
Sistema Controle de Estoque ASP.NET
 
Aprendendo Na Prática: Aplicativos Web Com Asp.Net MVC em C# e Entity Framewo...
Aprendendo Na Prática: Aplicativos Web Com Asp.Net MVC em C# e Entity Framewo...Aprendendo Na Prática: Aplicativos Web Com Asp.Net MVC em C# e Entity Framewo...
Aprendendo Na Prática: Aplicativos Web Com Asp.Net MVC em C# e Entity Framewo...
 
Programação c# - banco de dados
Programação   c# - banco de dadosProgramação   c# - banco de dados
Programação c# - banco de dados
 
Apostila desenvolvimento aplicações comerciais com C#
Apostila desenvolvimento aplicações comerciais com C#Apostila desenvolvimento aplicações comerciais com C#
Apostila desenvolvimento aplicações comerciais com C#
 
Introdução a linguagem C# (CSharp)
Introdução a linguagem C# (CSharp)Introdução a linguagem C# (CSharp)
Introdução a linguagem C# (CSharp)
 

Similaire à LINQ - C#

Visual Studio 2010 e C# 4
Visual Studio 2010 e C# 4Visual Studio 2010 e C# 4
Visual Studio 2010 e C# 4
CDS
 

Similaire à LINQ - C# (20)

Hibernate-consultas
Hibernate-consultasHibernate-consultas
Hibernate-consultas
 
LINQ - Language Integrated Query
LINQ - Language Integrated QueryLINQ - Language Integrated Query
LINQ - Language Integrated Query
 
ORM - TDC Porto Alegre 2014 Trilha .NET
ORM - TDC Porto Alegre 2014 Trilha .NETORM - TDC Porto Alegre 2014 Trilha .NET
ORM - TDC Porto Alegre 2014 Trilha .NET
 
Funcionalidades de Acesso a Dados no 'Mango'
Funcionalidades de Acesso a Dados no 'Mango'Funcionalidades de Acesso a Dados no 'Mango'
Funcionalidades de Acesso a Dados no 'Mango'
 
Automação de testes de API utilizando Postman
Automação de testes de API utilizando PostmanAutomação de testes de API utilizando Postman
Automação de testes de API utilizando Postman
 
Visual Studio 2010 e C# 4
Visual Studio 2010 e C# 4Visual Studio 2010 e C# 4
Visual Studio 2010 e C# 4
 
Escrevendo códigos php seguros
Escrevendo códigos php segurosEscrevendo códigos php seguros
Escrevendo códigos php seguros
 
Tdc2016 trilha-banco-influx.ppt
Tdc2016 trilha-banco-influx.pptTdc2016 trilha-banco-influx.ppt
Tdc2016 trilha-banco-influx.ppt
 
InfluxDb: como monitorar milhares de dados por segundo em real time
InfluxDb: como monitorar milhares de dados por segundo em real time InfluxDb: como monitorar milhares de dados por segundo em real time
InfluxDb: como monitorar milhares de dados por segundo em real time
 
TDC2016SP - Trilha Banco de Dados
TDC2016SP - Trilha Banco de DadosTDC2016SP - Trilha Banco de Dados
TDC2016SP - Trilha Banco de Dados
 
Noçoes de LINQ
Noçoes de LINQNoçoes de LINQ
Noçoes de LINQ
 
Zabbix Conference LatAm 2016 - Jorge Pretel - Low Level Discovery for ODBC an...
Zabbix Conference LatAm 2016 - Jorge Pretel - Low Level Discovery for ODBC an...Zabbix Conference LatAm 2016 - Jorge Pretel - Low Level Discovery for ODBC an...
Zabbix Conference LatAm 2016 - Jorge Pretel - Low Level Discovery for ODBC an...
 
jQuery e ASP.Net MVC a dupla dinâmica
jQuery e ASP.Net MVC a dupla dinâmicajQuery e ASP.Net MVC a dupla dinâmica
jQuery e ASP.Net MVC a dupla dinâmica
 
Preparando-se para a prova da Certificação Zend PHP 5.3
Preparando-se para a prova da Certificação Zend PHP 5.3Preparando-se para a prova da Certificação Zend PHP 5.3
Preparando-se para a prova da Certificação Zend PHP 5.3
 
Novidades do .Net 4.0
Novidades do .Net 4.0Novidades do .Net 4.0
Novidades do .Net 4.0
 
Desenvolvendo com Silverlight para WP7 Mango [Update]
Desenvolvendo com Silverlight para WP7 Mango [Update]Desenvolvendo com Silverlight para WP7 Mango [Update]
Desenvolvendo com Silverlight para WP7 Mango [Update]
 
Criando e consumindo Web Services (REST) com o CakePHP
Criando e consumindo Web Services (REST) com o CakePHPCriando e consumindo Web Services (REST) com o CakePHP
Criando e consumindo Web Services (REST) com o CakePHP
 
TDC2016SP - Trilha BigData
TDC2016SP - Trilha BigDataTDC2016SP - Trilha BigData
TDC2016SP - Trilha BigData
 
Proteja sua aplicação com o zend framework 2
Proteja sua aplicação com o zend framework 2Proteja sua aplicação com o zend framework 2
Proteja sua aplicação com o zend framework 2
 
i-Educar - 1º Seminário PHP no Serpro
i-Educar - 1º Seminário PHP no Serproi-Educar - 1º Seminário PHP no Serpro
i-Educar - 1º Seminário PHP no Serpro
 

Dernier

Dernier (9)

Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemplo
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
 
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
 
Programação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdfProgramação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdf
 
ATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docx
ATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docxATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docx
ATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docx
 
Luís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdfLuís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdf
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object Calisthenics
 
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
 

LINQ - C#

  • 2. Facilitador Fernando Padoan Engenheiro de Sistemas http://www.cesar.org.br/
  • 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.
  • 8. Execução Imediata int quantos = nomesCurtos.Count(); Outros exemplos: .ToArray(), .ToList(), .First()...
  • 9. Tipos de Dados "Queryable data types": IEnumerable IEnumerable<T> IQueryable<T> ... ou qualquer outro tipo que implemente IEnumerable<T>.
  • 10. Tipos de Dados na Consulta IEnumerable<string> nomesCurtos = from li in linguagens where li.Length < 4 select li; Mais exemplos:
  • 11. Query vs. Method Syntax int[] numeros = { 1, 2, 3, 5, 8, 13, 21, 34 }; IEnumerable<int> pares = // query??? foreach (int i in pares) { Console.Write(i + " "); }
  • 12. Query Syntax IEnumerable<int> pares = from num in numeros where num % 2 == 0 orderby num select num;
  • 13. Method Syntax IEnumerable<int> pares = numeros.Where(num => num % 2 == 0).OrderBy(n => n); Extension methods Lambda expressions
  • 14. LINQ Extension Methods namespace System.Linq { public static class Enumerable { // ... public static IEnumerable<TSource> Where<TSource>( this IEnumerable<TSource> source, Func<TSource, bool> predicate) // ... } // ... }
  • 15. Lambda Expressions "num => num % 2 == 0" "n => n" "Func<TSource, bool> predicate" "=>" : "goes to"
  • 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