Partilhar via


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.

link para vídeo 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

  1. Inicie o Visual Studio

  2. No menu File, aponte para New, e em seguida, clique em Project.

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

  4. Clique o O aplicativo de Console ícone em Visual Studio Installed Templates.

  5. Dar um novo nome de seu aplicativo ou aceite o nome padrão e clique em OK.

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

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

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

  1. 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
    
  2. 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
    
  3. 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

  1. 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];
    
  2. 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);
        }
    }
    
  3. 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

  1. É 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);
                }
    
    
  2. 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:

LINQ to SQL

LINQ to DataSet

LINQ to XML

LINQ para Objetos

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

Outros recursos

LINQ (consulta integrada à linguagem)

Guia de Introdução do LINQ em C#