Share via


Noções básicas expressão de consulta (guia de programação translation from VPE for Csharp)

O que é uma consulta e o que é ele fazer?

A consulta é um conjunto de instruções que descreve quais dados para recuperar de uma fonte de dados determinado (ou origens) e qual forma e a organização devem ter os dados retornados.Uma consulta é diferente do que ele produz resultados.

Em geral, sistema autônomo dados de fonte são organizados logicamente sistema autônomo uma sequência de elementos do mesmo tipo.Uma tabela de banco de dados SQL contém uma sequência de linhas.Similarly, an ADO.NET DataTable contains a sequence of DataRow objects.Em um arquivo XML, existe uma "sequência" de elementos XML (embora eles são organizados hierarquicamente em uma estrutura de árvore).Uma coleção em memória contém uma sequência de objetos.

Do ponto de vista do aplicativo, o tipo específico e a estrutura dos dados de fonte original não é importante.O aplicativo sempre vê sistema autônomo dados de fonte sistema autônomo um IEnumerable<T> ou IQueryable<T> coleção. In LINQ to XML, sistema autônomo dados de fonte são tornados visíveis sistema autônomo um IEnumerable<XElement>. In LINQ to DataSet, é um IEnumerable<DataRow>. In LINQ to SQL, é um IEnumerable ou IQueryable de qualquer objetos personalizados, você definiu para representar os dados na tabela SQL.

Dada essa sequência de fonte, uma consulta pode siga um destes três coisas:

  • Recuperar um subconjunto dos elementos para produzir uma nova sequência sem modificar os elementos individuais.A consulta pode classificar ou agrupar a sequência retornada de várias maneiras, sistema autônomo mostrado no exemplo a seguir (suponha scores é um int[]):

    IEnumerable<int> highScoresQuery =
        from score in scores
        where score > 80
        orderby score descending
        select score;
    
  • Recuperar uma sequência de elementos sistema autônomo no exemplo anterior, mas transformá-los para um novo tipo de objeto.Por exemplo, uma consulta pode recuperar apenas os sobrenomes de certos registros de cliente em uma fonte de dados.Ou ele pode recuperar o registro completo e usá-lo para criar outro tipo de objeto de memória ou até mesmo dados XML antes de gerar a sequência de resultado final.O exemplo a seguir mostra uma transformação de um int para um string. Observe o novo tipo de highScoresQuery.

    IEnumerable<string> highScoresQuery2 =
        from score in scores
        where score > 80
        orderby score descending
        select String.Format("The score is {0}", score);
    
  • Recupere um valor singleton sobre sistema autônomo dados de fonte, tais sistema autônomo:

    • O número de elementos que coincidam com uma determinada condição.

    • O elemento que contém o valor maior ou menor.

    • O primeiro elemento corresponde a uma condição ou a soma dos valores específicos em um conjunto especificado de elementos.Por exemplo, a consulta a seguir retorna o número de resultados maior do que 80 from a scores matriz de inteiros:

    int highScoreCount =
        (from score in scores
         where score > 80
         select score)
         .Count();
    

    No exemplo anterior, observe o uso de parênteses da expressão de consulta antes da telefonar para o Count método. Você também pode expressar isso usando uma nova variável para armazenar o resultado de concreto.Essa técnica é mais legível porque ele mantém a variável que armazenam a consulta separado de consulta que armazena um resultado.

    IEnumerable<int> highScoresQuery3 =
        from score in scores
        where score > 80
        select score;
    
    int scoreCount = highScoresQuery3.Count();
    

No exemplo anterior, a consulta é executada na telefonar para Count, pois Count deve iterar sobre os resultados para determinar o número de elementos retornada por highScoresQuery.

O que é uma expressão de consulta?

A expressão de consulta é uma consulta expressa na sintaxe de consulta.Uma expressão de consulta é uma construção de linguagem de primeira classe.É exatamente como qualquer Outros expressão e pode ser usado em qualquer contexto em que uma expressão translation from VPE for Csharp é válida.Uma expressão de consulta consiste em um conjunto de cláusulas escrito em uma sintaxe declarativa semelhante à SQL ou XQuery.Cada cláusula por sua vez, contém uma ou mais expressões translation from VPE for Csharp e essas expressões podem se ser uma expressão de consulta ou conter uma expressão de consulta.

Uma expressão de consulta deve começar com um de cláusula e deve terminar com um selecionar or agrupar cláusula.Entre o primeiro from cláusula e o último select ou group cláusula, ele pode conter uma ou mais das seguintes cláusulas opcionais: onde, OrderBy, unir, permitir que e até mesmo adicionais de cláusulas.Você também pode usar o em palavra-chave para permitir que o resultado de um join ou group cláusula para servir sistema autônomo a fonte de cláusulas de consulta adicionais na mesma expressão de consulta.

A variável de consulta

In LINQ, uma variável de consulta é qualquer variável que armazena um consulta em vez do resultados de uma consulta. Mais especificamente, uma variável de consulta é sempre um tipo de enumerável produzirá uma sequência de elementos quando são iterado um foreach demonstrativo ou uma telefonar direta para seus IEnumerator.MoveNext método.

O exemplo de código a seguir mostra uma expressão de consulta simples com uma fonte de dados, uma cláusula de filtragem, uma cláusula de pedidos e sem transformação dos elementos de origem.The select cláusula termina a consulta.

static void Main()
{
    // Data source.
    int[] scores = { 90, 71, 82, 93, 75, 82 };

    // Query Expression.
    IEnumerable<int> scoreQuery = //query variable
        from score in scores //required
        where score > 80 // optional
        orderby score descending // optional
        select score; //must end with select or group

    // Execute the query to produce the results
    foreach (int testScore in scoreQuery)
    {
        Console.WriteLine(testScore);
    }                  
}
// Outputs: 90 82 93 82      

No exemplo anterior, scoreQuery é um variável de consulta que às vezes é chamado de apenas um consulta.A variável de consulta não armazena nenhum dado do resultado real, que é produzido no foreach loop. E quando o foreach demonstrativo é executada, os resultados da consulta não são devolvidos através da variável de consulta scoreQuery. Em vez disso, são retornados por meio de iteração variável testScore. The scoreQuery variável pode ser iterada em um segundo foreach loop. Ela produzirá sistema autônomo mesmos resultados, desde que ela nem a fonte de dados foi modificada.

Uma variável de consulta pode armazenar uma consulta é expressa na sintaxe de consulta ou sintaxe do método ou uma combinação dos dois.Os exemplos a seguir, os dois queryMajorCities e queryMajorCities2 são variáveis de consulta:

//Query syntax
IEnumerable<City> queryMajorCities =
    from city in cities
    where city.Population > 100000
    select city;


// Method-based syntax
IEnumerable<City> queryMajorCities2 = cities.Where(c => c.Population > 100000);

Por Outros lado, os dois exemplos a seguintes mostram variáveis que não são variáveis de consulta até mesmo através de cada uma é inicializada com uma consulta.Eles não são variáveis de consulta porque os resultados são armazenados:

int highestScore =
    (from score in scores
     select score)
    .Max();

// or split the expression
IEnumerable<int> scoreQuery =
    from score in scores
    select score;

int highScore = scoreQuery.Max();

IEnumerable<City> largeCityList =
    (from country in countries
     from city in country.Cities
        where city.Population > 10000
        select city)
       .ToList();

// or split the expression
IEnumerable<City> largeCityList2 =
    from country in countries
     from city in country.Cities
     where city.Population > 10000
     select city;

List<City> largeCities = largeCityList2.ToList();
Observação:

No LINQdocumentação, variáveis que armazenam uma consulta com a palavra "consulta" sistema autônomo parte de seus nomes. Variáveis que armazenam um resultado real não são necessário "consulta" em seus nomes.

Para obter mais informações sobre as diferentes maneiras de expressar consultas, consulte Sintaxe de consulta versus sintaxe do método (LINQ).

Digitação implícita e explícita de variáveis de consulta

Esta documentação geralmente fornece o tipo explícito da variável de consulta para mostrar a relação de tipo entre a variável de consulta e o selecionar cláusula.No entanto, você também pode usar o var palavra-chave para instruir o compilador para inferir o tipo de uma variável de consulta (ou qualquer Outros variável local) em time de compilar.Por exemplo, o exemplo de consulta que foi mostrado anteriormente neste tópico também pode ser expresso por meio de digitação implícita:

// Use of var is optional here and in all queries.
// queryCities is an IEnumerable<City> just as 
// when it is explicitly typed.
var queryCities =
    from city in cities
    where city.Population > 100000
    select city;

Para obter mais informações, consulte Digitados implicitamente variáveis locais (guia de programação translation from VPE for Csharp) e Relações de tipo em operações de Consulta (LINQ).

Iniciando uma expressão de consulta

Uma expressão de consulta deve começar com um from cláusula. Especifica uma fonte de dados em conjunto com uma variável de intervalo.A variável de intervalo representa cada elemento sucessivo na sequência de fonte sistema autônomo a sequência de fonte é sendo atravessada.A variável de intervalo é digitada altamente com base no tipo de elementos na fonte de dados.No exemplo a seguir, pois countries é uma matriz de Country objetos, a variável de intervalo também é digitado sistema autônomo Country. Porque a variável de intervalo tem rigidez de tipos, você pode usar o operador ponto para acessar quaisquer membros disponível do tipo.

IEnumerable<Country> countryAreaQuery =
    from country in countries
    where country.Area > 500000 //sq km
    select country;

A variável de intervalo está no escopo até que a consulta é finalizada com um ponto-e-vírgula ou com um continuação cláusula.

Uma expressão de consulta pode conter vários from cláusulas. Usar adicionais from cláusulas quando cada elemento da sequência de fonte é uma coleção ou contém uma coleção. Por exemplo, suponha que você tenha uma coleção de Country objetos, cada uma delas contém uma coleção de City objetos nomeados Cities. Para consultar o City objetos em cada Country, use dois from cláusulas, sistema autônomo mostrado aqui:

IEnumerable<City> cityQuery =
    from country in countries
    from city in country.Cities
    where city.Population > 10000
    select city;

Para obter mais informações, consulte (referência translation from VPE for Csharp) da cláusula FROM.

Encerrar uma expressão de consulta

Uma expressão de consulta deve terminar com um um select cláusula ou um group cláusula.

Cláusula de agrupar

Use o group cláusula para produzir uma sequência de grupos organizados por uma chave que você especificar. A chave pode ser qualquer tipo de dados.Por exemplo, a consulta a seguir cria uma sequência de grupos que contém um ou mais Country os objetos e cuja chave é um valor de sequência de caracteres.

var queryCountryGroups =
    from country in countries
    group country by country.Name[0];

Para obter mais informações sobre agrupamento, consulte cláusula de agrupar (translation from VPE for Csharp Reference).

selecionar cláusula

Use o select cláusula para produzir todos os outros tipos de seqüências. Um simples select cláusula produz somente uma sequência do mesmo tipo de objetos sistema autônomo objetos contidos na fonte de dados. Neste exemplo, a fonte de dados contém Country objetos. The orderby cláusula apenas classifica os elementos em uma nova ordem e o select cláusula produz uma sequência do reordenados Country objetos.

IEnumerable<Country> sortedQuery =
    from country in countries
    orderby country.Area
    select country;

The select cláusula pode ser usada para transformar dados de fonte em seqüências de novos tipos. Essa transformação também é chamada um projeção.No exemplo a seguir, a select cláusula projetos uma sequência de tipos anônimo que contém somente um subconjunto dos campos no elemento original.Observe que os novos objetos são inicializados por meio de um inicializador de objeto.

// Here var is required because the query
// produces an anonymous type.
var queryNameAndPop =
    from country in countries
    select new { Name = country.Name, Pop = country.Population };

Para obter mais informações sobre todas as formas que um select cláusula pode ser usada para transformar dados de fonte, consulte selecionar cláusula (translation from VPE for Csharp Reference).

Continuação com "em"

Você pode usar o into palavra-chave em um select ou group cláusula para criar um identificador temporário que armazena uma consulta. Faça isso quando você deve executar operações de consulta adicional em uma consulta após um agrupamento ou Selecionar operação.No exemplo seguinte countries são agrupados de acordo com a população em intervalos de 10 milhões. Após esses grupos são cláusulas criado, additional filtro check-out de alguns grupos e, em seguida, para classificar os grupos no crescente da ordem.Para executar essas operações adicionais, continuação representada por countryGroup é necessário.

// percentileQuery is an IEnumerable<IGrouping<int, Country>>
var percentileQuery =
    from country in countries
    let percentile = (int) country.Population / 10000000
    group country by percentile into countryGroup
    where countryGroup.Key >= 20
    orderby countryGroup.Key
    select countryGroup;

// grouping is an IGrouping<int, Country>
foreach (var grouping in percentileQuery)
{
    Console.WriteLine(grouping.Key);
    foreach (var country in grouping)
        Console.WriteLine(country.Name + ":" + country.Population);
}

Para obter mais informações, consulte em (translation from VPE for Csharp Reference).

Filtragem, pedidos e associação

Entre o início from cláusula e o final select ou group cláusula, todos os outros () cláusulaswhere, join, orderby, from, let) são opcionais. Qualquer uma das cláusulas opcionais pode ser usado tempos de zero ou várias vezes no corpo de uma consulta.

onde cláusula

Use o where cláusula para filtrar os elementos de dados de fonte com base em uma ou mais expressões de predicado. The where cláusula no exemplo a seguir possui duas predicados.

IEnumerable<City> queryCityPop =
    from city in cities
    where city.Population < 200000 && city.Population > 100000
    select city;

Para obter mais informações, consulte cláusula WHERE (Translation from VPE for Csharp Reference).

Cláusula OrderBy

Use o orderby cláusula para classificar os resultados em crescente ou decrescente. Você também pode especificar as ordens de classificar secundária.O exemplo a seguir executa uma classificar primária sobre o country objetos usando o Area propriedade. Em seguida, ele executa uma classificar secundária usando o Population propriedade.

IEnumerable<Country> querySortedCountries =
    from country in countries
    orderby country.Area > 500000, country.Population descending
    select country;

The ascending palavra-chave é opcional; é a ordem de classificar padrão se nenhuma ordem for especificada. Para obter mais informações, consulte cláusula OrderBy (translation from VPE for Csharp Reference).

Cláusula de unir

Use o join cláusula para associar e/ou agrupar elementos de uma fonte de dados com elementos de outra fonte de dados com base em uma comparação de igualdade entre chaves especificadas em cada elemento. In LINQ, as operações de unir são executadas em seqüências de objetos cujos elementos são tipos diferentes. Após você ter ingressado duas seqüências, você deve usar um select ou group demonstrativo para especificar qual elemento para armazenar a sequência de saída. Você também pode usar um tipo anônimo para agrupar propriedades de cada conjunto de elementos associados em um novo tipo para a sequência de saída.O exemplo a seguir associa prod os objetos cujas Category propriedade corresponde a uma das categorias no categories matriz de seqüência de caracteres. Produtos cujo Category não é compatível com qualquer seqüência de caracteres em categories serão filtrados. The select demonstrativo um novo tipo cujas propriedades são tiradas de ambos os projetos cat e prod.

var categoryQuery =
    from cat in categories
    join prod in products on cat equals prod.Category
    select new { Category = cat, Name = prod.Name };

Você também pode executar uma unir de agrupar, armazenando os resultados do join operação em uma variável temporária usando o em palavra-chave.Para obter mais informações, consulte cláusula de unir (translation from VPE for Csharp Reference).

permitir que a cláusula

Use o let cláusula para armazenar o resultado de uma expressão sistema autônomo uma telefonar de método em uma nova variável de intervalo. No exemplo a seguir, o intervalo de variável s armazena o primeiro elemento da matriz de seqüência de caracteres retornado pelo Split.

string[] names = { "Svetlana Omelchenko", "Claire O'Donnell", "Sven Mortensen", "Cesar Garcia" };
IEnumerable<string> queryFirstNames =
    from name in names
    let firstName = name.Split(new char[] { ' ' })[0]
    select firstName;

foreach (string s in queryFirstNames)
    Console.Write(s + " ");
//Output: Svetlana Claire Sven Cesar

Para obter mais informações, consulte permitir que a cláusula (translation from VPE for Csharp Reference).

Subconsultas em uma expressão de consulta

Se uma clásula de consulta pode conter uma expressão de consulta, às vezes é conhecida sistema autônomo um subconsulta.Cada subconsulta começa com seu próprio from cláusula necessariamente não aponta para a mesma fonte de dados no primeiro from cláusula. Por exemplo, a consulta a seguir mostra uma expressão de consulta usada na demonstrativo selecionar para recuperar os resultados de uma operação de agrupamento.

var queryGroupMax =
    from student in students
    group student by student.GradeLevel into studentGroup
    select new
    {
        Level = studentGroup.Key,
        HighestScore =
            (from student2 in studentGroup
             select student2.Scores.Average())
             .Max()
    };

Para obter mais informações, consulte Como: Executar uma subconsulta em uma operação de agrupamento (guia de programação translation from VPE for Csharp).

Consulte também

Conceitos

Guia de Programação C#

Expressões de consulta do LINQ (guia de programação translation from VPE for Csharp)

Referência

Guia de programação do LINQ geral

Outros recursos

Language-Integrated Query (LINQ)

Palavras-chave de consulta (translation from VPE for Csharp Reference)