Você está na página 1de 34

Introduo s consultas do LINQ (C#)

1 de 1 pessoas classificaram isso como til - Avalie este tpico


Uma query (consulta) uma expresso que recupera dados de um fonte de dados. As consultas
normalmente so expressas em uma linguagem especializada de consulta. Diferentes linguagens
foram desenvolvidas ao longo do tempo para os diversos tipos de fontes de dados, como por
exemplo SQL para bancos de dados relacionais e XQuery para XML. Portanto, os desenvolvedores
tiveram que aprender uma nova linguagem de consulta para cada tipo de fonte de dados ou
formato de dados que eles devem oferecer suporte.LINQsimplifica a essa situao, oferecendo um
modelo consistente para trabalhar com dados em vrios tipos de fontes de dados e formatos. Em
uma consulta LINQ, voc est sempre trabalhando com objetos. Voc usa a mesma codificao de
padres bsicos para a query e transformar dados em documentos XML, bases de dados SQL,
ADO.NET Datasets,colees .NET, e qualquer outro formato para o qual um provedor LINQ esteja
disponvel.

Trs partes de uma operao de consulta


Todos os LINQ consulta operaes consistem em trs aes distintas:
1. Obtenha a fonte de dados.
2. Crie a consulta.
3. Execute a consulta.
O exemplo a seguir mostra como as trs partes de uma operao de consulta so expressos no
cdigo-fonte. O exemplo usa uma matriz de inteiros como uma fonte de dados por convenincia;
no entanto, os mesmos conceitos se aplicam a outras fontes de dados tambm. Este exemplo
chamado em todo o restante deste tpico.
C#

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 ilustrao a seguir mostra a operao de consulta completa. Em LINQ a execuo da consulta


diferente da prpria consulta; em outras palavras voc no recuperou quaisquer dados, apenas
criou uma varivel de consulta.

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#

// Create a data source from an XML document.

// 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#

Northwnd db = new Northwnd(@"c:\northwnd.mdf");


// Query for customers in London.
IQueryable<Customer> custQuery =
from cust in db.Customers
where cust.City == "London"
select cust;

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

enquanto, o ponto importante que no LINQ, a varivel de consulta no pratica nenhuma ao e


no retorna dados.Ela apenas armazena as informaes que so necessrias para produzir os
resultados quando a consulta for executada em algum momento posterior. Para obter mais
informaes sobre como as consultas so construdas nos bastidores, consulte Viso geral
operadores de consulta padro.

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

Como mencionado anteriormente, a varivel de consulta somente armazena os comandos de


consulta. A real execuo da consulta adiada at que voc faa a iterao pela varivel de
consulta em uma instruoforeach. Esse conceito conhecido como execuo adiada e
demonstrado no exemplo a seguir:
C#

// Query execution.
foreach (int num in numQuery)
{
Console.Write("{0,1} ", num);
}

A instruo <code>foreach</code> tambm onde os resultados da consulta so


recuperados. Por exemplo, na consulta anterior, a varivel de iterao <code>num</code>
mantm cada valor (um de cada vez) na seqncia retornada.
Como a prpria varivel de consulta nunca mantm os resultados da consulta, voc pode executla com tanta freqncia quanto desejar. Por exemplo, voc pode ter um banco de dados que est
sendo atualizado continuamente por um aplicativo separado. Em seu aplicativo, voc poderia criar
uma consulta que recupera os dados mais recentes e voc pode execut-la repetidamente alguns
intervalos para recuperar resultados diferentes a cada vez.
Forar a execuo imediata
Consultas que executam funes de agregao em um intervalo de elementos de origem devem
primeiro iterar a esses elementos. Examples of such queries are Count, Max, Average,
and First. Essas executam sem uma instruo foreach explcita porque a consulta em si deve
usar foreach para retornar um resultado.Observe tambm que esses tipos de consultas retornam
um valor nico, no um IEnumerable coleo. A seguinte consulta retorna um contador dos
nmeros pares na matriz de origem:

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.

LINQ e tipos genricos (C#)


1 de 1 pessoas classificaram isso como til - Avalie este tpico
Consultas LINQ so baseadas em tipos genricos, que foram introduzidos na verso 2.0 do .NET
Framework.No necessrio um conhecimento profundo dos genricos antes de comear a
escrever consultas. No entanto, talvez seja necessrio compreender dois conceitos bsicos:
1. Quando voc cria uma instncia de uma classe que uma coleo genrica como por
exemplo List<T>, voc substitui o "T" com o tipo de objetos que a lista conter. Por

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 <T> variveis em consultas LINQ


LINQvariveis de consulta so digitadas como IEnumerable<T> ou um tipo derivado,
como IQueryable<T>.Quando voc vir uma varivel de consulta que tipada como
IEnumerable<Customer>, isso apenas significa que a consulta, quando ela executada, produzir
uma seqncia de zero ou mais objetos Customer.
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).

Permitindo que as declaraes de tipo genrico do compilador


ala
Se voc preferir, voc pode evitar a sintaxe genrica usando o var palavra-chave. O var palavrachave instrui o compilador para inferir o tipo de uma varivel de consulta, observando a fonte de
dados especificada afrom clusula. O exemplo a seguir produz o mesmo cdigo compilado do
exemplo anterior:
C#

var customerQuery2 =
from cust in customers
where cust.City == "London"

select cust;
foreach(var customer in customerQuery2)
{
Console.WriteLine(customer.LastName + ", " + customer.FirstName);
}

A palavra-chave var til quando o tipo de varivel bvio ou quando no importante


especificar explicitamente tipos genricos aninhados como aqueles que so produzidos por
consultas agrupadas. Em geral, recomendamos que, se voc usar var, perceba que ele pode
tornar seu cdigo mais difcil para outras pessoas lerem. Para obter mais informaes, veja
Digitada implicitamente variveis Local (C# Guia de programao).

Operaes de consulta do LINQ bsicas


(C#)
Este tpico ainda no foi avaliado como - Avalie este tpico
Este tpico fornece uma breve introduo s expresses de consulta LINQ e alguns dos tipos
tpicos de operaes que voc executa em uma consulta. Informaes mais detalhadas esto nos
seguintes tpicos:
Expresses de consulta do LINQ (guia de programao do C#)
Viso geral operadores de consulta padro

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.

Como obter uma fonte de dados


Em uma consulta de LINQ, a primeira etapa especificar a origem de dados. Em C# como na
maioria das linguagens de programao uma varivel deve ser declarada antes que ele possa ser
usado. Em uma consulta de LINQ , a clusula from vem pPrimeiro na ordem para apresentar os
dados de origem (customers) e o intervalo varivel (cust).
C#

//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#

var queryLondonCustomers = from cust in customers


where cust.City == "London"
select cust;

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#

where cust.City=="London" && cust.Name == "Devon"

Para retornar a clientes de Londres ou Paris, voc escreveria o seguinte cdigo:


C#

where cust.City == "London" || cust.City == "Paris"

Para obter mais informaes, consulte onde a clusula (referncia de 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;

Para solicitar os resultados em ordem inversa de z a, use o orderbydescending clusula.

Para obter mais informaes, consulte clusula OrderBy (referncia de C#).

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#

// queryCustomersByCity is an IEnumerable<IGrouping<string, Customer>>


var queryCustomersByCity =
from cust in customers
group cust by cust.City;
// customerGroup is an IGrouping<string, Customer>
foreach (var customerGroup in queryCustomersByCity)
{
Console.WriteLine(customerGroup.Key);
foreach (Customer customer in customerGroup)
{
Console.WriteLine(" {0}", customer.Name);
}
}

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#

// custQuery is an IEnumerable<IGrouping<string, Customer>>


var custQuery =
from cust in customers
group cust by cust.City into custGroup
where custGroup.Count() > 2
orderby custGroup.Key
select custGroup;

Para obter mais informaes, consulte clusula de AAgruparar (Referncia 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...

Para obter mais informaes, consulte (Referncia C#) de clusula de Juno.

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.

Transformaes de dados com o LINQ


(C#)
Este tpico ainda no foi avaliado como - Avalie este tpico
LINQ (Consulta Integrada Linguagem)no apenas sobre como recuperar dados. Tambm uma
ferramenta poderosa para transformar dados. Usando um LINQ consulta, voc pode usar uma
seqncia de origem como entrada e modific-lo de vrias maneiras para criar uma nova
seqncia de sada. Voc pode modificar a seqncia sem modificar os prprios elementos pela
classificao e agrupamento. Mas talvez o mais poderoso recurso de LINQ consultas a
capacidade de criar novos tipos. Isso realizado da Selecionar clusula. Por exemplo, voc pode
executar as seguintes tarefas:
a. Mescle vrias seqncias de entrada em uma seqncia de sada simples que tem um novo
tipo.
b. Crie seqncias de sada, cujos elementos consistem em apenas uma ou vrias
propriedades de cada elemento da seqncia de origem.
c. Crie seqncias de sada, cujos elementos consistem nos resultados das operaes
realizadas nos dados de origem.
d. Crie seqncias de sada em um formato diferente. Por exemplo, voc pode transformar os
dados das linhas SQL ou arquivos de texto em XML.
Esses so apenas alguns exemplos. Obviamente, essas transformaes podem ser combinadas de
vrias maneiras na mesma consulta. Alm disso, a seqncia de sada de uma consulta pode ser
usada como a seqncia de entrada para uma nova consulta.

Ingressando em vrias entradas em uma sada seqncia


Voc pode usar um LINQ consulta para criar uma seqncia de sada que contm elementos de
mais de uma seqncia de entrada. O exemplo a seguir mostra como combinar duas estruturas de
dados na memria, mas os mesmos princpios podem ser aplicados para combinar dados de
origens XML ou SQL ou DataSet.Considere os seguintes tipos de dois classe:

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; }
}

O exemplo a seguir mostra a consulta:


C#

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}},
};

// Create the second data source.


List<Teacher> teachers = new List<Teacher>()
{
new Teacher {First="Ann", Last="Beebe", ID=945, City = "Seattle"},
new Teacher {First="Alex", Last="Robinson", ID=956, City = "Redmond"},
new Teacher {First="Michiyo", Last="Sato", ID=972, City = "Tacoma"}
};
// Create the query.
var peopleInSeattle = (from student in students
where student.City == "Seattle"
select student.Last)
.Concat(from teacher in teachers
where teacher.City == "Seattle"
select teacher.Last);
Console.WriteLine("The following students and teachers live in Seattle:");
// Execute the query.
foreach (var person in peopleInSeattle)
{
Console.WriteLine(person);
}
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
/* Output:
The following students and teachers live in Seattle:
Omelchenko
Beebe
*/

Para obter mais informaes, consulte clusula JOIN (referncia de C#) e (referncia de C#) da
clusula Select.

Selecionar um subconjunto de cada elemento de origem


H duas maneiras principais de selecionar um subconjunto de cada elemento da seqncia de
origem:
1. Para selecionar apenas um membro do elemento de origem, use a operao de ponto. O
exemplo a seguir, suponha que um Customer objeto contm vrias propriedades pblicas,
incluindo uma seqncia de caracteres denominada City. Quando executada, essa consulta
produzir uma seqncia de sada de cadeias de caracteres.
2. var query = from cust in Customers
3.

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.

select new {Name = cust.Name, City = cust.City};

Para obter mais informaes, consulte Objeto e coleo inicializadores (guia de programao do
C#) e Tipos annimos (guia de programao do C#).

Transformar objetos na memria em XML


LINQconsultas tornam mais fcil transformar dados entre as estruturas de dados na memria,
bancos de dados SQL, ADO.NET conjuntos de dados e documentos ou fluxos XML. O exemplo a
seguir transforma objetos em uma estrutura de dados na memria em elementos XML.
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();
}
}

O cdigo produz a sada XML a seguir:


< 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>

Para obter mais informaes, consulte Creating XML Trees in C#.

Executar operaes em elementos de origem


Uma seqncia de sada pode no conter os elementos ou as propriedades do elemento da
seqncia de origem. A sada em vez disso, pode ser uma seqncia de valores calculada
usando elementos de origem como argumentos de entrada. A seguinte consulta simple, quando
ele executado, produz uma seqncia de cadeias de caracteres cujos valores representam um
clculo com base na seqncia de origem dos elementos do tipo double.

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
*/

Relaes de tipo em operaes de


consulta do LINQ (C#)
Este tpico ainda no foi avaliado como - Avalie este tpico
Para escrever consultas com eficcia, voc deve entender como os tipos de variveis em uma
operao de consulta completa a todos os se relacionam entre si. Se voc compreender esses
relacionamentos ser mais fcil compreender o LINQ amostras e exemplos de cdigo na
documentao. Alm disso, voc entender o que ocorre nos bastidores, quando as variveis so
digitadas implicitamente, usando var.
LINQoperaes de consulta tem rigidez de tipos na fonte de dados, a consulta em si e a execuo
da consulta. O tipo das variveis na consulta deve ser compatvel com o tipo dos elementos na
fonte de dados e com o tipo da varivel de iterao na foreach instruo. Este tipagem forte
garante que os erros de tipo so detectados em tempo de compilao quando eles podem ser
corrigidos antes que os usurios se deparar com elas.

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.

Consultas que no transformar os dados de origem


A ilustrao a seguir mostra um LINQ operao que no realiza nenhum transformaes nos dados
de consulta para objetos. A fonte contm uma seqncia de cadeias de caracteres e a sada da
consulta tambm uma seqncia de cadeias de caracteres.

1. O argumento de tipo da fonte de dados determina o tipo de varivel de intervalo.


2. O tipo do objeto selecionado determina o tipo de varivel de consulta. Aqui name uma
seqncia de caracteres. Portanto, a varivel de consulta um IEnumerable<string>.
3. A varivel de consulta iterada na foreach instruo. Como a varivel de consulta uma
seqncia de cadeias de caracteres, a varivel de iterao tambm uma seqncia de
caracteres.

Consultas que transformam os dados de origem


A ilustrao a seguir mostra um LINQ to SQL operao que executa uma transformao simple nos
dados de consulta. A consulta usa uma seqncia de Customer objetos como entrada e seleciona
somente a Namepropriedade no resultado. Porque Name uma seqncia, produz o consulta uma
seqncia de cadeias de caracteres como sada.

1. O argumento de tipo da fonte de dados determina o tipo de varivel de intervalo.


2. O select instruo retorna a Name propriedade em vez do
completo Customer objeto. Porque Name uma seqncia, o argumento Tipo
do custNameQuery string, e no Customer.
3. Porque custNameQuery uma seqncia de seqncias de caracteres, o foreach varivel
de iterao do loop tambm deve ser um string.
A ilustrao a seguir mostra uma transformao ligeiramente mais complexa. O select instruo
retorna um tipo annimo que captura apenas dois membros do original Customer objeto.

1. O argumento de tipo da fonte de dados sempre o tipo da varivel de intervalo na


consulta.
2. Porque o select instruo produz um tipo annimo, a varivel de consulta deve ser digitada
implicitamente, usando var.
3. Porque o tipo da varivel de consulta est implcito, a varivel de iterao na foreach loop
tambm deve ser implcito.

Permitindo que o compilador a inferir o tipo de informaes


Embora voc deve compreender as relaes de tipo em uma operao de consulta, voc tem a
opo para permitir que o compilador fazer todo o trabalho por voc. A palavra-chave var pode ser
usado para qualquer varivel local em uma operao de consulta. A ilustrao a seguir
exatamente equivalente ao nmero de exemplo 2 foi discutido anteriormente. A nica diferena
que o compilador ir fornecer o tipo de alta segurana para cada varivel na operao de
consulta:

Para obter mais informaes sobre o var, consulte Variveis de locais digitadas implicitamente
(C# Guia de programao).

C# recursos que oferecem suporte ao


LINQ
Este tpico ainda no foi avaliado como - Avalie este tpico
A seo a seguir apresenta novas construes de linguagem, introduzidas no C# 3.0. Embora
esses novos recursos so usados para um grau com LINQ consultas, eles no esto limitados a
LINQ e pode ser usado em qualquer contexto onde voc encontr-los teis.

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#).

Implicitamente variveis do tipo (var)


Em vez de especificar explicitamente um tipo ao declarar e inicializar uma varivel, voc pode
usar o varmodificador para instruir o compilador para inferir e atribuir o tipo, conforme mostrado
aqui:
var number = 5;
var name = "Virginia";
var query = from str in stringArray
where str[0] == 'm'
select str;

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).

Objeto e coleo inicializadores


Inicializadores de objeto e coleo tornam possvel inicializar objetos sem explicitamente chamar
um construtor para o objeto. Inicializadores so normalmente usados em expresses de consulta
quando eles os dados de origem do projeto em um novo tipo de dados. Supondo que uma classe
chamada Customer com pblico Name e Phone propriedades, o inicializador de objeto podem ser
usadas como no cdigo a seguir:
Customer cust = new Customer { Name = "Mike", Phone = "555-1212" };

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:

Funes annimas (guia de programao do C#)

Expresses lambda (guia de programao do C#)

rvores de expresso (C# e Visual Basic)

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;}

Para obter mais informaes, consulte Auto-implementado propriedades (guia de programao do


C#).

Passo a passo: Escrever consultas em C#


(LINQ)
Este tpico ainda no foi avaliado como - Avalie este tpico

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.

Criar uma fonte de dados na memria


A fonte de dados para as consultas uma lista simples de Student objetos. Cada Student registro
tem um nome, sobrenome e uma matriz de inteiros que representa seus resultados de teste na
classe. Copie este cdigo para seu projeto. Observe as seguintes caractersticas:

O Student classe consiste em Propriedades de auto-implementado.

Cada aluno na lista inicializado com um inicializador de objeto.

A prpria lista inicializada com um inicializador de coleo.

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#

public class Student


{
public string First { get; set; }
public string Last { get; set; }
public int ID { get; set; }
public List<int> Scores;
}
// Create a data source by using a collection initializer.
static 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}},
new Student {First="Cesar", Last="Garcia", ID=114, Scores= new List<int> {97, 89, 85, 82}},
new Student {First="Debra", Last="Garcia", ID=115, Scores= new List<int> {35, 72, 91,
70}},
new Student {First="Fadi", Last="Fakhouri", ID=116, Scores= new List<int> {99, 86, 90,
94}},
new Student {First="Hanying", Last="Feng", ID=117, Scores= new List<int> {93, 92, 80,
87}},
new Student {First="Hugo", Last="Garcia", ID=118, Scores= new List<int> {92, 90, 83, 78}},
new Student {First="Lance", Last="Tucker", ID=119, Scores= new List<int> {68, 79, 88,
92}},
new Student {First="Terry", Last="Adams", ID=120, Scores= new List<int> {99, 82, 81, 79}},
new Student {First="Eugene", Last="Zabokritski", ID=121, Scores= new List<int> {96, 85,
91, 60}},
new Student {First="Michael", Last="Tucker", ID=122, Scores= new List<int> {94, 92, 91,
91} }
};

Para adicionar um novo estudante para a lista de alunos

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

Para criar uma consulta simples

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#

// Create the query.


// The first line could also be written as "var studentQuery ="
IEnumerable<Student> studentQuery =
from student in students
where student.Scores[0] > 90
select student;

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

Cada elemento da seqncia retornada acessado atravs da varivel de iterao


na foreachloop.

O tipo desta varivel Student, e o tipo da varivel de consulta


compatvel,IEnumerable<Student>.

2. Aps adicionar esse cdigo, construir e executar o aplicativo pressionando Ctrl + F5 para
ver os resultados no Console janela.
C#

// Execute the query.


// var could be used here also.
foreach (Student student in studentQuery)
{
Console.WriteLine("{0}, {1}", student.Last, student.First);
}

Para adicionar outra condio de filtro

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.

where student.Scores[0] > 90 && student.Scores[3] < 80

Para mais informaes, consulte onde a clusula (referncia de C#).

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]);

Para obter mais informaes, consulte clusula orderby (Referncia C#).


Para agrupar os resultados
1. O agrupamento um recurso poderoso em expresses de consulta. Uma consulta com uma
clusula group produz uma seqncia de grupos e cada grupo em si contm um Key e uma
seqncia que consiste em todos os membros desse grupo. A nova consulta a seguir agrupa
os alunos usando a primeira letra do sobrenome, como a chave.
C#

// studentQuery2 is an IEnumerable<IGrouping<char, Student>>


var studentQuery2 =
from student in students
group student by student.Last[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#

// studentGroup is a IGrouping<char, Student>


foreach (var studentGroup in studentQuery2)
{
Console.WriteLine(studentGroup.Key);
foreach (Student student in studentGroup)
{
Console.WriteLine(" {0}, {1}",
student.Last, student.First);
}
}

3. Pressione Ctrl + F5 para executar o aplicativo e visualize os resultados no Console janela.


Para obter mais informaes, consulte clusula de AAgruparar (Referncia C#).
Para tornar as variveis digitadas implicitamente

Codificao explicitamente IEnumerables de IGroupings pode rapidamente se tornar


entediante.Voc pode escrever a mesma consulta e foreach muito mais conveniente
usando um loop var. O varpalavra-chave no altera os tipos de seus objetos; ele apenas
instrui o compilador para inferir os tipos.Alterar o tipo de studentQuery e a varivel de
iterao group para var e execute novamente a consulta. Observe que no
interno foreach loop, a varivel de iterao ainda digitada comoStudent, e a consulta
funciona exatamente como antes. Alterar o s a varivel de iterao para var e executar a
consulta novamente. Voc ver que voc obtenha exatamente os mesmos resultados.
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

Ao executar a consulta anterior, observe que os grupos no esto em ordem


alfabtica. Para alterar isso, voc deve fornecer um orderby clusula aps
a group clusula. Mas, para usar um orderbyclusula, primeiro necessrio um
identificador que serve como uma referncia para os grupos criados
pela group clusula. Voc fornece o identificador usando o into palavra-chave, como
segue:
C#

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);
}

Para mais informaes, consulte permitir que a clusula (referncia de C#).


Para usar a sintaxe do mtodo em uma expresso de consulta

Conforme descrito em Sintaxe de consulta do LINQ em comparao com a sintaxe do


mtodo (C#), algumas operaes de consulta s podem ser expresso usando a sintaxe do
mtodo. O cdigo a seguir calcula a pontuao total para cada Student na seqncia de
origem e, em seguida, chamadas de Average() mtodo nos resultados dessa consulta para
calcular a pontuao mdia da classe.Observe a colocao de parnteses em torno da
expresso de consulta.
C#

var studentQuery6 =
from student in students

let totalScore = student.Scores[0] + student.Scores[1] +


student.Scores[2] + student.Scores[3]
select totalScore;
double averageScore = studentQuery6.Average();
Console.WriteLine("Class average score = {0}", averageScore);

A transformao ou o projeto na clusula select


1. muito comum para uma consulta produzir uma seqncia cujos elementos so diferentes
dos elementos em seqncias de cdigo-fonte. Exclua ou comente o loop de consulta e
execuo anterior e substitu-lo com o cdigo a seguir. Observe que a consulta retorna uma
seqncia de cadeias de caracteres (no Students), e esse fato refletido na foreach loop.
C#

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);
}

2. Cdigo anteriormente indicou que a pontuao mdia de classe aproximadamente


334. Para produzir uma seqncia de Students cuja pontuao total maior do que a mdia
de classe, junto com seus Student ID, voc pode usar um tipo annimo no select instruo:
C#

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 };

foreach (var item in studentQuery8)


{
Console.WriteLine("Student ID: {0}, Score: {1}", item.id, item.score);
}

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.

Como: consulta um ArrayList com LINQ


Este tpico ainda no foi avaliado como - Avalie este tpico
Ao usar o LINQ a consulta no genrico IEnumerable colees, como ArrayList, voc deve declarar
explicitamente o tipo da varivel de intervalo para refletir o tipo especfico de objetos na
coleo. Por exemplo, se voc tiver um <notranslate>ArrayList</notranslate> de objetos
<code>Student<code>, a clusula from<notranslate>clusula from</notranslate> (C#) ou A
partir da clusula (Visual Basic)<notranslate>A partir da clusula (Visual Basic)</notranslate> A
partir da clusula (Visual Basic)<notranslate>A partir da clusula (Visual Basic)</notranslate>A
partir da clusula (Visual Basic) deve ficar assim:
// C#
var query = from Student s in arrList
...
'Visual Basic
Dim query = From student As Student In arrList
...

Especificando o tipo de varivel de intervalo, a cada item so projeo do ArrayList para


um Student.
O uso de uma varivel de intervalo explicitamente digitado em uma expresso de consulta
equivalente a chamar o Cast<TResult> mtodo. Cast<TResult> lana uma exceo se a
converso especificada no pode ser executada. Cast<TResult> e OfType<TResult> so os dois
mtodos de operador de consulta padro operam em no-genricas IEnumerable tipos. Na Visual
Basic, voc deve explicitamente chamar o Cast<TResult> mtodo na fonte de dados para garantir
que um tipo de varivel de intervalo especfico. Para obter mais informaes, consulteRelaes de
tipo em operaes de consulta (Visual Basic) e Relaes de tipo em operaes de consulta do LINQ
(C#).

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
*/