Demonstra Passo a passo: Escrever consultas em C# (LINQ)
Esta explicação passo a passo demonstra os recursos de linguagem C# que são usados para escrever LINQ expressões de consulta. Depois de concluir este passo a passo, você estará pronto para passar para os exemplos e documentações específicos do LINQ provedor que você está interessado, como LINQ to SQL, LINQ conjuntos de dados, ou LINQ to XML.
Pré-requisitos
Esta explicação passo a passo requer Visual Studio 2010.
Para obter uma versão de vídeo deste tópico, consulte vídeo How to: Escrever consultas em C# (LINQ).
Criar um projeto C#
Para criar um projeto C# que destinos versão 3.5 do.NET Framework
Inicie o Visual Studio
No menu File, aponte para New, e em seguida, clique em Project.
No canto superior direito da Novo projeto caixa de diálogo possui três ícones. Clique no ícone à esquerda e certifique-se de que .NET Framework versão 3.5 é verificado.
Clique o O aplicativo de Console ícone em Visual Studio Installed Templates.
Dar um novo nome de seu aplicativo ou aceite o nome padrão e clique em OK.
Observe que o seu projeto tem uma referência a System.Core.dll e um using diretiva para o System.Linq namespace.
Criar uma fonte de dados na memória
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 representam suas pontuações de teste em que a classe. Copie este código em seu projeto. Observe as seguintes características:
O Student classe consiste propriedades auto-implementado.
Cada aluno na lista é inicializado com um inicializador de objeto.
A lista em si é inicializada com um inicializador de coleção.
A estrutura de dados inteira será inicializada e instanciada sem chamadas explícitas para qualquer acesso de membro explícito ou o construtor. Para obter mais informações sobre esses novos recursos, consulte Automático- e Objeto e coleção inicializadores (guia de programação TRANSLATION FROM VPE FOR CSHARP).
Para criar a fonte de dados
Adicionar o Student classe e a lista de inicializado dos alunos para o Program classe no projeto.
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="O’Donnell", 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 lista e use um nome e testar as pontuações de sua escolha. Tente digitar as novas informações de aluno para melhor saber a sintaxe para o inicializador de objeto.
Criar a consulta.
Para criar uma consulta simples
No aplicativo de Main método, criar uma consulta simples que, quando ele é executado, produzirá uma lista de todos os alunos cuja pontuação no primeiro teste era maior do que 90. Observe que, como todo o Student objeto é selecionado, o tipo de consulta é IEnumerable<Student>. Embora o código também pode usar digitação implícita usando o var palavra-chave, uma digitação explícita é usada para ilustrar claramente os resultados. (Para obter mais informações sobre var, consulte Implicitamente digitado variáveis locais (TRANSLATION FROM VPE FOR CSHARP guia de programação).)
Observe também que a consulta a variável de intervalo, student, que serve como uma referência a cada Student na fonte, fornecendo acesso de membro para cada objeto.
// 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
Agora escrever o foreach loop fará com que a consulta seja executada. Observe o seguinte sobre o código:
Cada elemento da seqüência retornada é acessado através da variável de iteração na foreach loop.
O tipo desta variável é Student, e o tipo da variável de consulta é compatível, IEnumerable<Student>.
Após ter adicionado a esse código, construir e executar o aplicativo pressionando Ctrl + F5 para ver os resultados no Console janela.
// 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 condição de filtro
Você pode combinar várias condições booleanas no where cláusula para facilitar refinar uma consulta. O código a seguir adiciona uma condição para que a consulta retorna os alunos cuja primeira pontuação foi mais de 90 e cuja última pontuação foi inferior a 80. O where cláusula deve se parecer com o código a seguir.
where student.Scores[0] > 90 && student.Scores[3] < 80
Para obter mais informações, consulte onde cláusula (referência de TRANSLATION FROM VPE FOR CSHARP).
Modificar a consulta.
A ordem dos resultados
Será mais fácil examinar os resultados se eles estiverem em algum tipo de ordem. Você pode solicitar a seqüência retornada por qualquer campo acessível nos elementos de origem. Por exemplo, o seguinte orderby cláusula Ordena os resultados em ordem alfabética, de À Z, de acordo com para o sobrenome de cada aluno. Adicione o seguinte orderby cláusula à sua consulta, à direita após o where instrução e antes do select instrução:
orderby student.Last ascending
Agora altere o orderby cláusula, de modo que ele Ordena os resultados em ordem inversa de acordo com à pontuação no primeiro teste, da pontuação mais alta à menor pontuação.
orderby student.Scores[0] descending
Alterar o WriteLine formato de seqüência de caracteres para que você possa ver as pontuações:
Console.WriteLine("{0}, {1} {2}", student.Last, student.First, student.Scores[0]);
Para obter mais informações, consulte cláusula OrderBy (referência de TRANSLATION FROM VPE FOR CSHARP).
Para agrupar os resultados
O agrupamento é um poderoso recurso de expressões de consulta. Uma consulta com uma cláusula group produz uma seqüência de grupos e cada grupo em si contém um Key e uma seqüência que consiste em todos os membros do grupo. A nova consulta a seguir agrupa os alunos usando a primeira letra do sobrenome, como a chave.
// studentQuery2 is an IEnumerable<IGrouping<char, Student>> var studentQuery2 = from student in students group student by student.Last[0];
Observe que o tipo de consulta foi alterado. Agora, ela produz uma seqüência de grupos que têm um char o tipo como uma chave e uma seqüência de Student objetos. Como o tipo de consulta foi alterada, as seguintes alterações no código do foreach execução loop também:
// 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); } }
Pressione Ctrl + F5 para executar o aplicativo e visualize os resultados no Console janela.
Para obter mais informações, consulte cláusula Group (referência de TRANSLATION FROM VPE FOR CSHARP).
Para tornar as variáveis digitadas implicitamente
Codificação explicitamente IEnumerables de IGroupings pode rapidamente se tornar entediante. Você pode escrever a mesma consulta e foreach loop muito mais conveniente usando var. O var palavra-chave não altera os tipos de seus objetos; Assim, ele instrui o compilador para inferir os tipos. Alterar o tipo de studentQuery e a variável de iteração group para var e execute novamente a consulta. Observe que no interno foreach loop, a variável de iteração ainda é digitada como Student, e a consulta funciona exatamente como antes. Alterar o s a variável de iteração para var e execute novamente a consulta. Você verá que você obtenha exatamente os mesmos resultados.
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 informações sobre var, consulte Implicitamente digitado variáveis locais (TRANSLATION FROM VPE FOR CSHARP guia de programação).
Para solicitar os grupos por valor de chave
Ao executar a consulta anterior, observe que os grupos não estão em ordem alfabética. Para alterar isso, você deve fornecer um orderby cláusula após a group cláusula. Mas, para usar um orderby cláusula, primeiro é necessário um identificador que serve como uma referência para os grupos criados pela group cláusula. Você fornecer o identificador usando o into palavra-chave, como segue:
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 agora, os grupos são classificados em ordem alfabética.
Apresentar um identificador usando let
Você pode usar o let palavra-chave para introduzir um identificador para qualquer resultado da expressão na expressão de consulta. Esse identificador pode ser uma conveniência, como no exemplo a seguir, ou pode melhorar o desempenho, armazenando os resultados de uma expressão para que ele não tem a ser calculada várias vezes.
// 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 obter mais informações, consulte Deixe que a cláusula (referência de TRANSLATION FROM VPE FOR CSHARP).
Para usar a sintaxe do método em uma expressão de consulta
Conforme descrito em Sintaxe de consulta do LINQ em comparação com a sintaxe do método (C#), algumas operações de consulta só podem ser expresso usando sintaxe do método. O código a seguir calcula a pontuação total para cada Student na seqüência de origem e chama o Average() método nos resultados dessa consulta para calcular a pontuação média da classe. Observe a colocação de parênteses em torno da expressão de consulta.
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 transformação ou o projeto na cláusula select
É muito comum para uma consulta produzir uma seqüência cujos elementos são diferentes dos elementos em seqüências de origem. Exclua ou comente o loop de consulta e execução anterior e substituí-lo com o código a seguir. Observe que a consulta retorna uma seqüência de cadeias de caracteres (não Students), e esse fato se reflete na foreach loop.
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); }
Código anteriormente nesta explicação passo a passo indicou que a pontuação média de classe é aproximadamente 334. Para produzir uma seqüência de Students cuja pontuação total é maior do que a média de classe, junto com seus Student ID, você pode usar um tipo anônimo no select instrução:
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); }
Próximas etapas
Depois que você estiver familiarizado com os aspectos básicos de trabalhar com consultas no C#, você estará pronto para ler a documentação e exemplos para o tipo específico de LINQ provedor que você está interessado em:
Consulte também
Tarefas
Demonstra Passo a passo: Escrever consultas em Visual Basic
Conceitos
<>>Expressões de consulta do LINQ (guia de programação TRANSLATION FROM VPE FOR CSHARP)
Recursos suplementares do LINQ