Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
class IntroToLINQ
{
static void Main()
{
// The Three Parts of a LINQ Query:
// 1. Data source.
int[] numbers = new int[7] { 0, 1, 2, 3, 4, 5, 6 };
// 2. Query creation.
// numQuery is an IEnumerable<int>
var numQuery =
from num in numbers
where (num % 2) == 0
select num;
// 3. Query execution.
foreach (int num in numQuery)
{
Console.Write("{0,1} ", num);
}
}
}
A fonte de dados
No exemplo anterior, como a fonte de dados uma matriz, implicitamente oferece suporte a
interface genrica IEnumerable<T>. Esse fato significa que ele pode ser consultado com
LINQ. Uma consulta executada em um foreach instruo,
e foreach requer IEnumerable ou IEnumerable<T>. Tipos que oferecem suporte
IEnumerable<T> ou uma interface derivada, como a genrica IQueryable<T> so chamados
de tipos consultveis.
Um tipo passvel de consulta no requer modificao ou tratamento especial para servir como uma
fonte de dados LINQ. Se os dados de origem no estiverem na memria como um tipo passvel de
consulta, o provedor LINQ deve represent-lo como tal. Por exemplo, LINQ to XML carrega um
documento XML em um que podem ser consultados XElement tipo:
C#
// using System.Xml.Linq;
XElement contacts = XElement.Load(@"c:\myContactList.xml");
Com LINQ para SQL, primeiro crie um mapeamento objeto-relacional em tempo de design
manualmente ou usando o Object Relational Designer (O/R Designer). Voc escreve suas consultas
nos objetos, e em tempo de execuo o LINQ para SQL gerencia a comunicao com o banco de
dados. No exemplo a seguir,Customers representa uma tabela especfica no banco de dados e o
tipo de resultado da consulta,IQueryable<T>, deriva de IEnumerable<T>.
C#
Para obter mais informaes sobre como criar tipos especficos de fontes de dados, consulte a
documentao para os vrios provedores LINQ.No entanto, a regra bsica muito simples: Uma
fonte de dados LINQ qualquer objeto que oferece suporte a interface genrica IEnumerable<T>,
ou uma interface que herde dela.
Observao
Tipos, tais como ArrayList, que oferecem suporte a interface no-genrica IEnumerable tambm podem ser
usados como uma fonte de dados LINQ.Para obter mais informaes, consulte Como: Consultar um ArrayList
com o LINQ.
A consulta
A consulta especifica quais informaes recuperar a partir da (ou das) fonte de
dados. Opcionalmente, uma consulta tambm especifica como as informaes devem ser
classificadas, agrupadas e moldadas antes que algo seja retornado. Uma consulta armazenada
em uma varivel de consulta e inicializada com uma expresso de consulta. Para tornar mais fcil
escrever consultas, C# apresentou nova sintaxe de consulta.
A consulta no exemplo anterior retorna todos os nmeros pares da matriz de inteiros. A expresso
de consulta contm trs clusulas: from, where e select. (Se voc estiver familiarizado com SQL,
voc ter observado que a ordem das clusulas revertida da ordem em SQL.) A
clusula from especifica o fonte de dados, a clusula where aplica o filtro, e a
clusula select especifica o tipo dos elementos retornados. Essas e outras clusulas de consulta
so discutidas em detalhes na seo <a href="http://msdn.microsoft.com/ptbr/library/bb397676.aspx">Expresses de Consulta do LINQ (Guia de programao C#)</a>. Por
Observao
As consultas tambm podem ser expressas usando a sintaxe do mtodo. Para obter mais informaes,
consulte Sintaxe de consulta do LINQ em comparao com a sintaxe do mtodo (C#).
Execuo da consulta
Execuo retardada
// Query execution.
foreach (int num in numQuery)
{
Console.Write("{0,1} ", num);
}
C#
var evenNumQuery =
from num in numbers
where (num % 2) == 0
select num;
int evenNumCount = evenNumQuery.Count();
Para forar a execuo imediata de qualquer consulta e cache destes resultados, voc pode
chamar o mtodo ToList<TSource> ou ToArray<TSource).
C#
List<int> numQuery2 =
(from num in numbers
where (num % 2) == 0
select num).ToList();
// or like this:
// numQuery3 is still an int[]
var numQuery3 =
(from num in numbers
where (num % 2) == 0
select num).ToArray();
Voc tambm pode forar a execuo, colocando o lao foreach imediatamente aps a expresso
de consulta. No entanto, chamando ToList ou ToArray voc tambm armazenar em cache todos
os dados em um nico objeto de coleo.
exemplo, uma lista de seqncias de caracteres expressa como List<string>e uma lista
de Customer objetos expresso comoList<Customer>. Uma lista genrica tem rigidez de
tipos e oferece muitos benefcios em colees que armazenam seus elementos
como Object. Se voc tentar adicionar um Customer para umList<string>, voc obter um
erro em tempo de compilao. fcil de usar colees genricas porque voc no tem que
executar a converso de tipo em tempo de execuo.
2. IEnumerable<T> a interface que permite que as classes de coleo genrica a serem
enumeradas usando a instruo foreach. Classes de coleo genrica oferecem suporte
IEnumerable<T> classes de coleo apenas como no-genricas
como ArrayList suporte IEnumerable.
Para obter mais informaes sobre os genricos, consulte Genricos (guia de programao do C#).
IEnumerable<Customer> customerQuery =
from cust in customers
where cust.City == "London"
select cust;
foreach (Customer customer in customerQuery)
{
Console.WriteLine(customer.LastName + ", " + customer.FirstName);
}
Para obter mais informaes, consulte Tipo relacionamentos em operaes de consulta (LINQ).
var customerQuery2 =
from cust in customers
where cust.City == "London"
select cust;
foreach(var customer in customerQuery2)
{
Console.WriteLine(customer.LastName + ", " + customer.FirstName);
}
Observao
Se voc j estiver familiarizado com uma linguagem de consulta, como SQL ou XQuery, voc poder ignorar a
maioria deste tpico. Leia sobre a "clusula from" na prxima seo para saber mais sobre a ordem das clusulas
em expresses de consulta LINQ.
//queryAllCustomers is an IEnumerable<Customer>
var queryAllCustomers = from cust in customers
select cust;
A varivel de intervalo como a varivel de iterao em uma foreach um loop, exceto que
nenhum iterao real ocorre em uma expresso de consulta. Quando a consulta executada, a
varivel de intervalo servir como uma referncia para cada elemento sucessivo
na customers. Porque o compilador pode inferir o tipo de cust, voc no precisar especific-la
explicitamente. Variveis de alcance adicionais podem ser introduzidas por um let clusula. Para
obter mais informaes, consulte permitir que a clusula (Referncia C#).
Observao
Para dados no-genricas, como fontes ArrayList, a varivel de intervalo deve ser digitada explicitamente.Para
obter mais informaes, consulte Como: Consultar um ArrayList com LINQ e (referncia de TRANSLATION
FROM VPE FOR CSHARP) da clusula FROM.
Filtro
Provavelmente a operao de consulta mais comum aplicar um filtro no formulrio de uma
expresso Booleana. O filtro faz com que a consulta retorne apenas aqueles elementos para os
quais a expresso for verdadeira. O resultado produzido usando a clusula where. O filtro
no efeito especifica quais elementos podem excluir a seqncia de origem. No exemplo a seguir,
somente os customers que tm um endereo em Londres so retornados.
C#
Voc pode usar o familiar C# lgica AND e OR operadores para aplicar como muitas expresses,
conforme necessrio de filtro a where clusula. Por exemplo, para retornar somente os clientes do
"Londres" AND cujo nome "Juliana Paes", voc escreveria o seguinte cdigo:
C#
Ordenao
Muitas vezes conveniente classificar os dados retornados. O orderby clusula far com que os
elementos na seqncia retornada para ser classificados de acordo com o comparador padro
para o tipo que est sendo classificado. Por exemplo, a seguinte consulta pode ser estendida para
classificar os resultados com base na Name propriedade. Como Name uma cadeia de caracteres,
o comparador padro executa uma classificao alfabtica de a Z.
C#
var queryLondonCustomers3 =
from cust in customers
where cust.City == "London"
orderby cust.Name ascending
select cust;
Agrupamento
O group clusula permite que voc agrupe seus resultados com base em uma chave que voc
especificar.Por exemplo, voc poderia especificar que os resultados devem ser agrupados
pela City para que todos os clientes de Londres ou Paris esto em grupos individuais. Nesse caso,
cust.City a chave.
Observao
Os tipos so explcitos nos exemplos a seguir para ilustrar o conceito. Voc tambm pode usar digitao
implcita para custQuery, group, e customer para deixar o compilador para determinar o tipo exato.
C#
Quando voc terminar de uma consulta com um group clusula, seus resultados assumem a
forma de uma lista de listas. Cada elemento na lista um objeto que tem uma Key membro e uma
lista de elementos que esto agrupadas sob essa chave. Quando voc itera atravs de uma
consulta que produz uma seqncia de grupos, voc deve usar um aninhadas foreach loop. O
loop externo itera em cada grupo, e o loop interno itera sobre membros do grupo.
Se voc deve consultar os resultados de uma operao de grupo, voc pode usar a palavra-chave
para criar um identificador que pode ser consultado ainda mais. A consulta a seguir retorna
apenas os grupos que contm mais de dois clientes:
C#
Ingressando em
As operaes de associao criar associaes entre as seqncias que no so explicitamente
modelados nas fontes de dados. Por exemplo, voc pode executar uma associao para localizar
todos os clientes e distribuidores que possuem o mesmo local. Na LINQ a join clusula sempre
funciona em relao a colees de objeto em vez de tabelas de banco de dados diretamente.
C#
var innerJoinQuery =
from cust in customers
join dist in distributors on cust.City equals dist.City
select new { CustomerName = cust.Name, DistributorName = dist.Name };
Na LINQ voc no precisar usar join com freqncia como se estivesse no SQL porque chaves
externas em LINQ so representados no modelo de objeto como propriedades que mantm uma
coleo de itens. Por exemplo, um Customer objeto contm uma coleo de Order objetos. Em vez
de executar uma associao, voc pode acessar as ordens, usando a notao de ponto:
from order in Customer.Orders...
Selecionando (projees)
O select clusula produz os resultados da consulta e especifica o tipo de cada elemento retornado
ou "forma". Por exemplo, voc pode especificar se os resultados consistir
completa Customer objetos, apenas um membro, um subconjunto de membros ou algum tipo de
resultado completamente diferente com base em um clculo ou a criao do novo objeto. Quando
o select clusula produz algo diferente de uma cpia do elemento de origem, a operao
chamada uma projeo. O uso de projees para transformar dados um recurso poderoso de
LINQ expresses de consulta. Para obter mais informaes, consulteTransformaes de dados com
o LINQ (C#) e (referncia de C#) da clusula Select.
C#
class Student
{
public string First { get; set; }
public string Last {get; set;}
public int ID { get; set; }
public string Street { get; set; }
public string City { get; set; }
public List<int> Scores;
}
class Teacher
{
public string First { get; set; }
public string Last { get; set; }
public int ID { get; set; }
public string City { get; set; }
}
class DataTransformations
{
static void Main()
{
// Create the first data source.
List<Student> students = new List<Student>()
{
new Student {First="Svetlana",
Last="Omelchenko",
ID=111,
Street="123 Main Street",
City="Seattle",
Scores= new List<int> {97, 92, 81, 60}},
new Student {First="Claire",
Last="ODonnell",
ID=112,
Street="124 Main Street",
City="Redmond",
Scores= new List<int> {75, 84, 91, 39}},
new Student {First="Sven",
Last="Mortensen",
ID=113,
Street="125 Main Street",
City="Lake City",
Scores= new List<int> {88, 94, 65, 91}},
};
Para obter mais informaes, consulte clusula JOIN (referncia de C#) e (referncia de C#) da
clusula Select.
select cust.City;
4. Para criar elementos que contm mais de uma propriedade do elemento de origem, voc
pode usar um inicializador de objeto com um objeto nomeado ou um tipo annimo. O
exemplo a seguir mostra o uso de um tipo annimo para encapsular as duas propriedades
de cada Customer elemento:
5. var query = from cust in Customer
6.
Para obter mais informaes, consulte Objeto e coleo inicializadores (guia de programao do
C#) e Tipos annimos (guia de programao do C#).
class XMLTransform
{
static void Main()
{
// Create the data source by using a collection initializer.
List<Student> students = new List<Student>()
{
new Student {First="Svetlana", Last="Omelchenko", ID=111, Scores = new List<int>{97, 92,
81, 60}},
new Student {First="Claire", Last="ODonnell", ID=112, Scores = new List<int>{75, 84, 91,
39}},
new Student {First="Sven", Last="Mortensen", ID=113, Scores = new List<int>{88, 94, 65,
91}},
};
// Create the query.
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)
) // end "student"
); // end "Root"
// Execute the query.
Console.WriteLine(studentsToXML);
// Keep the console open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
Observao
Chamar mtodos em expresses de consulta no suportado se a consulta ser convertida em algum outro
domnio. Por exemplo, voc no pode chamar um mtodo comum de C# LINQ to SQL porque SQL Server no
tem contexto para ele. No entanto, voc pode mapear procedimentos armazenados para mtodos e chamar
aqueles. Para obter mais informaes, consulte Stored Procedures: Mapping and Calling (LINQ to SQL).
C#
class FormatQuery
{
static void Main()
{
// Data source.
double[] radii = { 1, 2, 3 };
// Query.
IEnumerable<string> query =
from rad in radii
select String.Format("Area = {0}", (rad * rad) * 3.14);
// Query execution.
foreach (string s in query)
Console.WriteLine(s);
// Keep the console open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
/* Output:
Area = 3.14
Area = 12.56
Area = 28.26
*/
Para demonstrar essas relaes de tipo, a maioria dos exemplos a seguir usa a digitao explcita
para todas as variveis. O ltimo exemplo mostra como os mesmos princpios se aplicam mesmo
quando voc usa a digitao implcita usando var.
Para obter mais informaes sobre o var, consulte Variveis de locais digitadas implicitamente
(C# Guia de programao).
Expresses de consulta
Expresses de consultas usam a sintaxe declarativa semelhante a SQL ou XQuery consulta sobre
colees IEnumerable. Na compilao sintaxe de consulta de hora convertido para chamadas de
mtodo para um LINQ a implementao do provedor de mtodos de extenso de operadores de
consulta padro. Os aplicativos controlam os operadores de consulta padro que esto no escopo,
especificando o namespace apropriado com um using diretiva. A expresso de consulta a seguir
usa uma matriz de seqncias de caracteres, agrupa-os de acordo com para o primeiro caractere
na seqncia de caracteres e ordena os grupos.
var query = from str in stringArray
group str by str[0] into stringGroup
orderby stringGroup.Key
select stringGroup;
Para obter mais informaes, consulte Expresses de consulta LINQ (Guia de programao C#).
As variveis declaradas como var so apenas to fortemente tipados como variveis cujo tipo
voc especificar explicitamente.O uso de var torna possvel criar tipos annimos, mas ele pode ser
usado para qualquer varivel local.Arrays tambm podem ser declarados com a digitao
implcita.
Para obter mais informaes, consulte Variveis de locais digitadas implicitamente (C# Guia de
programao).
Para obter mais informaes, consulte Objeto e inicializadores de coleo (Guia de programao
C#).
Tipos Annimos
Um tipo annimo construdo pelo compilador e o nome do tipo s est disponvel para o
compilador. Tipos annimos fornecem uma maneira conveniente para agrupar um conjunto de
propriedades temporariamente em um resultado de consulta sem ter que definir um tipo nomeado
de separado. Tipos annimos so inicializados com uma nova expresso e um inicializador de
objeto, como mostrado aqui:
select new {name = cust.Name, phone = cust.Phone};
Para obter mais informaes, consulte Tipos annimos (Guia de programao C#).
Mtodos de extenso
Um mtodo de extenso um mtodo esttico que pode ser associado um tipo, para que ele pode
ser chamado como se fosse um mtodo de instncia no tipo. Este recurso permite que voc, na
verdade, "adicione" novos mtodos para tipos existentes sem realmente modific-los. Os
operadores de consulta padro so um conjunto de mtodos de extenso que fornecem LINQ para
qualquer tipo que implementa a funcionalidade de consulta IEnumerable<T>.
Para obter mais informaes, consulte Mtodos de extenso (Guia de programao C#).
Expresses Lambda
Uma expresso lambda uma funo embutida que usa a = > operador para separar parmetros
do corpo da funo de entrada e pode ser convertida em tempo de compilao para um
representante ou uma rvore de expresso. Na LINQ de programao, voc encontrar as
expresses lambda quando voc faz chamadas de mtodo direto para os operadores de consulta
padro.
Para obter mais informaes, consulte:
Propriedades de auto-implementado
Propriedades de auto-implementado fazem a declarao de propriedade mais conciso. Quando
voc declara uma propriedade, conforme mostrado no exemplo a seguir, o compilador criar um
campo particular e annimo de backup que no esteja acessvel, exceto por meio da propriedade
getter e setter.
public string Name {get; set;}
Esta explicao passo a passo demonstra os recursos de linguagem C# que so usados para
escrever LINQ expresses de consulta. Aps o trmino deste tutorial, voc estar apto
aprender(veja os links para os provedores especficos) o provedor LINQ que mais lhe convir(LINQ
para SQL, LINQ para DataSets ou LINQ para XML).
Pr-requisitos
Esta explicao passo a passo requer recursos que so introduzidos no Visual Studio de 2008.
Para obter uma verso de vdeo deste tpico, consulte vdeo How to: consultas de escrita em
C# (LINQ).
Criar um projeto C#
Para criar um projeto C# que destinos verso 3.5 do.NET Framework
1. Inicie o Visual Studio
2. No menu File, aponte para New e clique em Project.
3. No canto superior direito da caixa de dilogo Novo projeto existem trs cones. Clique no
cone esquerda e certifique-se que a opo.NET Framework verso 3.5 est marcada.
4. Clique no cone Console Application na guia Visual Studio Installed Templates.
5. Fornea um nome ao seu aplicativo, ou aceite o nome padro, e clique em OK.
6. Observe que o seu projeto possui uma referncia a System.Core.dll e uma
diretiva System.Linq para clusula using.
Essa estrutura de dados inteira ser inicializada e instanciada sem chamadas explcitas para
qualquer construtor ou acesso de membro explcito. Para obter mais informaes sobre esses
novos recursos, consulteAuto-implementado propriedades (guia de programao do C#) e Objeto
e coleo inicializadores (guia de programao do C#).
Para criar a fonte de dados
Adicionar o Student classe e a lista inicializada de que os alunos a Program classe em seu
projeto.
C#
Adicionar um novo Student para o Students de lista e use um nome e testar as pontuaes
de sua escolha. Tente digitar as novas informaes de aluno para melhor saber a sintaxe
para o inicializador de objeto.
Criar a consulta
No aplicativo de Main mtodo, criar uma consulta simples que, quando ele executado,
produzir uma lista de todos os alunos cuja pontuao no primeiro teste era maior do que
90. Observe que, como todo o Student objeto selecionado, o tipo de consulta
IEnumerable<Student>. Embora o cdigo tambm poderia usar digitao implcita
usando o var palavra-chave, uma digitao explcita usada para ilustrar claramente os
resultados. (Para obter mais informaes sobre var, consulteVariveis de locais digitadas
implicitamente (C# Guia de programao).)
Observe tambm que a consulta, a varivel de intervalo, student, serve como uma
referncia a cadaStudent na fonte, fornecendo acesso de membro para cada objeto.
C#
Executar a consulta
Para executar a consulta
1. Agora escrever o foreach loop que far com que a consulta seja executada. Observe o
seguinte sobre o cdigo:
o
2. Aps adicionar esse cdigo, construir e executar o aplicativo pressionando Ctrl + F5 para
ver os resultados no Console janela.
C#
Voc pode combinar vrias condies booleanas na where clusula para refinar uma
consulta. O cdigo a seguir adiciona uma condio para que a consulta retorne esses alunos
cuja primeira pontuao foi mais de 90 e cuja ltima pontuao foi inferior a
80. O where clusula deve se parecer com o cdigo a seguir.
Modificar a consulta
Para solicitar os resultados
1. Ser mais fcil examinar os resultados se eles estiverem em algum tipo de ordem. Voc
pode ordenar a seqncia retornada por qualquer campo acessvel em elementos de
origem. Por exemplo, o seguinte orderby clusula pedidos os resultados em ordem
alfabtica de Z de acordo com o ltimo nome de cada aluno. Adicione o
seguinte orderby clusula sua consulta, direita aps o whereinstruo e antes
do select instruo:
2. orderby student.Last ascending
3. Agora altere o orderby clusula, de modo que ele ordena os resultados em ordem inversa
de acordo com pontuao no primeiro teste, da pontuao mais alta menor pontuao.
4. orderby student.Scores[0] descending
5. Alterar o WriteLine Formatar seqncia para que voc possa ver as pontuaes:
6. Console.WriteLine("{0}, {1} {2}", student.Last, student.First, student.Scores[0]);
2. Observe que o tipo de consulta foi alterado. Agora, ela produz uma seqncia de grupos
que tm umchar tipo como uma chave e uma seqncia de Student objetos. Como o tipo
de consulta foi alterada, as seguintes alteraes no cdigo do foreach execuo loop
tambm:
C#
var studentQuery3 =
from student in students
group student by student.Last[0];
foreach (var groupOfStudents in studentQuery3)
{
Console.WriteLine(groupOfStudents.Key);
foreach (var student in groupOfStudents)
{
Console.WriteLine(" {0}, {1}",
student.Last, student.First);
}
}
Para obter mais informaes sobre var, consulte Variveis de locais digitadas
implicitamente (C# Guia de programao).
Para solicitar os grupos por seu valor de chave
var studentQuery4 =
from student in students
group student by student.Last[0] into studentGroup
orderby studentGroup.Key
select studentGroup;
foreach (var groupOfStudents in studentQuery4)
{
Console.WriteLine(groupOfStudents.Key);
foreach (var student in groupOfStudents)
{
Console.WriteLine(" {0}, {1}",
student.Last, student.First);
}
}
Quando voc executa essa consulta, voc ver que os grupos agora so classificados em
ordem alfabtica.
Apresentar um identificador usando let
Voc pode usar o let palavra-chave para introduzir um identificador para qualquer resultado
da expresso na expresso de consulta. Esse identificador pode ser uma convenincia,
como no exemplo a seguir, ou ele pode melhorar o desempenho, armazenando os
resultados de uma expresso para que ele no precisa ser calculado vrias vezes.
C#
// studentQuery5 is an IEnumerable<string>
// This query returns those students whose
// first test score was higher than their
// average score.
var studentQuery5 =
from student in students
let totalScore = student.Scores[0] + student.Scores[1] +
student.Scores[2] + student.Scores[3]
where totalScore / 4 < student.Scores[0]
select student.Last + " " + student.First;
foreach (string s in studentQuery5)
{
Console.WriteLine(s);
}
var studentQuery6 =
from student in students
IEnumerable<string> studentQuery7 =
from student in students
where student.Last == "Garcia"
select student.First;
Console.WriteLine("The Garcias in the class are:");
foreach (string s in studentQuery7)
{
Console.WriteLine(s);
}
var studentQuery8 =
from student in students
let x = student.Scores[0] + student.Scores[1] +
student.Scores[2] + student.Scores[3]
where x > averageScore
select new { id = student.ID, score = x };
LINQ to Objects
Este tpico ainda no foi avaliado como - Avalie este tpico
O termo "LINQ a objetos" refere-se ao uso de LINQ consultas com
qualquer IEnumerable ou IEnumerable<T>coleo diretamente, sem o uso de um intermedirio
LINQ provedor ou API como LINQ to SQL ou LINQ to XML. Voc pode usar LINQ para consultar
qualquer colees enumerveis, como List<T>, Array, ouDictionary<TKey, TValue>. A coleo
pode ser definida pelo usurio ou pode ser retornada por uma .NET Framework API.
De certa forma bsica, LINQ a objetos representa uma nova abordagem para colees. Da maneira
antiga, voc precisava escrever complexos foreach loops especificadas como recuperar dados de
uma coleo. No LINQ abordagem, voc escreve cdigo declarativo que descreve o que voc
deseja recuperar.
Alm disso, LINQ consultas oferecem trs principais vantagens tradicionais foreach loops:
1. Eles so mais conciso e legvel, especialmente quando a filtragem de vrias condies.
2. Eles fornecem poderosa filtragem, ordenao e agrupamento recursos com um mnimo de
cdigo do aplicativo.
3. Eles podem ser portados para outras fontes de dados com pouca ou nenhuma modificao.
Em geral, quanto mais complexo a operao que deseja executar nos dados, o benefcio mais voc
obter usando LINQ em vez de tcnicas tradicionais de iterao.
O objetivo desta seo demonstrar a LINQ abordagem com alguns exemplos de select. Ela no
pretende ser exaustiva.
Exemplo
O exemplo a seguir mostra uma consulta simples atravs de um ArrayList. Observe que este
exemplo usa os inicializadores de objeto quando o cdigo chama o Add mtodo, mas isso no
um requisito.
C#
VB
using System;
using System.Collections;
using System.Linq;
namespace NonGenericLINQ
{
public class Student
{
public string FirstName { get; set; }
public string LastName { get; set; }
public int[] Scores { get; set; }
}
class Program
{
static void Main(string[] args)
{
ArrayList arrList = new ArrayList();
arrList.Add(
new Student
{
FirstName = "Svetlana", LastName = "Omelchenko", Scores = new int[] { 98, 92, 81,
60 }
});
arrList.Add(
new Student
{
FirstName = "Claire", LastName = "ODonnell", Scores = new int[] { 75, 84, 91, 39 }
});
arrList.Add(
new Student
{
FirstName = "Sven", LastName = "Mortensen", Scores = new int[] { 88, 94, 65, 91 }
});
arrList.Add(
new Student
{
FirstName = "Cesar", LastName = "Garcia", Scores = new int[] { 97, 89, 85, 82 }
});
var query = from Student student in arrList
where student.Scores[0] > 95
select student;
foreach (Student s in query)
Console.WriteLine(s.LastName + ": " + s.Scores[0]);
// Keep the console window open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
}
/* Output:
Omelchenko: 98
Garcia: 97
*/